Compare commits
241
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eac3525a09 | ||
|
|
f28c0e0714 | ||
|
|
9a278da1e7 | ||
|
|
494d486af7 | ||
|
|
62a5787f01 | ||
|
|
536d36f983 | ||
|
|
5111fd7b25 | ||
|
|
c0fb7b90d9 | ||
|
|
b34d1ef335 | ||
|
|
c9dc453375 | ||
|
|
f85b78d973 | ||
|
|
9bf26d1292 | ||
|
|
806cbacd7e | ||
|
|
a019c66760 | ||
|
|
e06893f8e5 | ||
|
|
06bc509002 | ||
|
|
30617166f5 | ||
|
|
3d98558f75 | ||
|
|
d888476513 | ||
|
|
61bde64953 | ||
|
|
5a4e4b4326 | ||
|
|
c6e2d9edfb | ||
|
|
c81f77d539 | ||
|
|
17e236c774 | ||
|
|
7a87b73475 | ||
|
|
27ba83c3e7 | ||
|
|
43ecc2c6e3 | ||
|
|
0971c9d1f0 | ||
|
|
aab3e8264c | ||
|
|
80bd1bbdfa | ||
|
|
59bf84a95f | ||
|
|
9f3b2efd29 | ||
|
|
fd3f217dd9 | ||
|
|
1dca908ce4 | ||
|
|
7c2d2edea4 | ||
|
|
9098db91a3 | ||
|
|
f2322fa48d | ||
|
|
d757bc7c75 | ||
|
|
2ccc99c433 | ||
|
|
85400915f8 | ||
|
|
ea64b69c7e | ||
|
|
cf53611bf9 | ||
|
|
473e43a447 | ||
|
|
8060edfb21 | ||
|
|
671d43312a | ||
|
|
8e503c37f1 | ||
|
|
927c0a486b | ||
|
|
db8aad9ed7 | ||
|
|
35d1c3fe4e | ||
|
|
a3ab5fce2c | ||
|
|
1fd72be758 | ||
|
|
9d9a350947 | ||
|
|
d22f987b20 | ||
|
|
85357cd923 | ||
|
|
706c1ddd88 | ||
|
|
1be27c0ec7 | ||
|
|
f45082937d | ||
|
|
6c81910967 | ||
|
|
715794076f | ||
|
|
1d856949e5 | ||
|
|
e0f62fd012 | ||
|
|
d7d708456f | ||
|
|
8d61f7283c | ||
|
|
47bec6b187 | ||
|
|
858fe83e4a | ||
|
|
7da0f55b93 | ||
|
|
72ab9fc79b | ||
|
|
bca9b966fb | ||
|
|
5478907d9b | ||
|
|
5dd52daa70 | ||
|
|
6d7fb407cb | ||
|
|
00de3ced57 | ||
|
|
65d41cfcc2 | ||
|
|
81bcafca58 | ||
|
|
9033660c4b | ||
|
|
4e100ea8b1 | ||
|
|
1ae8907a27 | ||
|
|
c568099e62 | ||
|
|
a1b4fbe0a8 | ||
|
|
89f9a2c039 | ||
|
|
de4c5e997c | ||
|
|
335d377bce | ||
|
|
09ce0e5853 | ||
|
|
06d939aeaa | ||
|
|
8b203322bf | ||
|
|
8576ec41e5 | ||
|
|
a3705c13df | ||
|
|
43d6df4631 | ||
|
|
518563a814 | ||
|
|
bac5f4654a | ||
|
|
54d9875d56 | ||
|
|
b7079ecff4 | ||
|
|
a495397887 | ||
|
|
b9924cd6de | ||
|
|
ff025c25bf | ||
|
|
8bedb3e664 | ||
|
|
a08e897f57 | ||
|
|
c954d0cc47 | ||
|
|
555756fb25 | ||
|
|
c262539617 | ||
|
|
d6af5287a2 | ||
|
|
1096f54b1f | ||
|
|
896c097a15 | ||
|
|
6fc258d96b | ||
|
|
871b0cb655 | ||
|
|
32481daa30 | ||
|
|
f59f2054a6 | ||
|
|
54ade8d989 | ||
|
|
69d3249c8d | ||
|
|
7421d40fd2 | ||
|
|
33ca1c2b64 | ||
|
|
06a99936eb | ||
|
|
89ee59dbb2 | ||
|
|
fd2127f399 | ||
|
|
936ed074d1 | ||
|
|
81354797f8 | ||
|
|
12f979507b | ||
|
|
adf0ff918c | ||
|
|
d6f63656f1 | ||
|
|
daafcddcd8 | ||
|
|
eb8f75e17e | ||
|
|
9220d185c2 | ||
|
|
90624ed811 | ||
|
|
579aeade62 | ||
|
|
4b58acfc23 | ||
|
|
d241b2763a | ||
|
|
6128c0da14 | ||
|
|
1d69d7f8d0 | ||
|
|
230a135c3c | ||
|
|
eeaa7a8771 | ||
|
|
1831cd6228 | ||
|
|
6179f26ff3 | ||
|
|
aeb314c940 | ||
|
|
eed6782d01 | ||
|
|
323fb5a92d | ||
|
|
c47a389a77 | ||
|
|
0dd9d17cf4 | ||
|
|
97de80f1c2 | ||
|
|
f586cfbb01 | ||
|
|
52cbc8b2ee | ||
|
|
0f4733560f | ||
|
|
7b9bbc3ce7 | ||
|
|
e0b18ac9e1 | ||
|
|
5e1216b604 | ||
|
|
77007ca3e8 | ||
|
|
e8e187dfdc | ||
|
|
040129e10f | ||
|
|
04088232f3 | ||
|
|
26d7709e0b | ||
|
|
1a719b2ae4 | ||
|
|
cce182b84e | ||
|
|
05723441a8 | ||
|
|
a9c122584a | ||
|
|
9b97159b72 | ||
|
|
624d5dcf9e | ||
|
|
25c7be8c6d | ||
|
|
e35187cba6 | ||
|
|
a8f17042aa | ||
|
|
ef6b208ec4 | ||
|
|
45ab9930c4 | ||
|
|
2062de72ff | ||
|
|
d7b02819bf | ||
|
|
0831e2ed32 | ||
|
|
dc1a34b341 | ||
|
|
aa5ac8949f | ||
|
|
0403de7bdc | ||
|
|
ce11582a43 | ||
|
|
c15ab4627b | ||
|
|
237f41644e | ||
|
|
6d73022529 | ||
|
|
f56ad82386 | ||
|
|
fcea8c2832 | ||
|
|
aefba44e04 | ||
|
|
04d7f951d0 | ||
|
|
8c55e6253c | ||
|
|
3473b4c722 | ||
|
|
be7d3e1511 | ||
|
|
cd4e9e6e28 | ||
|
|
6057d6d814 | ||
|
|
c982c4d783 | ||
|
|
fd55d6c9ef | ||
|
|
d23c5539cc | ||
|
|
9634fef4db | ||
|
|
b3cb379a48 | ||
|
|
00a30b119b | ||
|
|
11929e6ef6 | ||
|
|
58e02289d5 | ||
|
|
03454dcf34 | ||
|
|
1606671ded | ||
|
|
a0e8327b4c | ||
|
|
baa6fe765f | ||
|
|
290b806034 | ||
|
|
877f3eb092 | ||
|
|
b641e0c57e | ||
|
|
97afe8f14d | ||
|
|
c655c95a16 | ||
|
|
d68e5c77c7 | ||
|
|
b7809258b0 | ||
|
|
ce88b8cbeb | ||
|
|
6437554106 | ||
|
|
2a0a7a2aa0 | ||
|
|
670cd92423 | ||
|
|
cdc6fcd8bb | ||
|
|
bda6eabd15 | ||
|
|
f08adcc49d | ||
|
|
fc185e6c9c | ||
|
|
2ca594fcec | ||
|
|
083015ca31 | ||
|
|
ee1ace28de | ||
|
|
16c6d7f05e | ||
|
|
2cb1abf11a | ||
|
|
17cf705b1a | ||
|
|
0e674fada3 | ||
|
|
a6c7b5d8aa | ||
|
|
5903934449 | ||
|
|
42643dd160 | ||
|
|
f7c4395f5c | ||
|
|
f993b8ae0b | ||
|
|
6ed06a2365 | ||
|
|
c0f1e5aaed | ||
|
|
5736d64d16 | ||
|
|
4d5fd04906 | ||
|
|
ede55038ca | ||
|
|
adf6ee822a | ||
|
|
b12a77dd4f | ||
|
|
14ebb03cfc | ||
|
|
7ad6f4d01f | ||
|
|
26c2d4b031 | ||
|
|
76aefdf266 | ||
|
|
4cdebe8eee | ||
|
|
da2b5afbaa | ||
|
|
0229020278 | ||
|
|
46ddf5915c | ||
|
|
fa1c190d17 | ||
|
|
c25c2790e8 | ||
|
|
9ea2ee09ce | ||
|
|
ac99db7346 | ||
|
|
0e22ae0877 | ||
|
|
4b6f203306 | ||
|
|
a221d47de4 | ||
|
|
f3cee39f53 |
No files matched your search
@@ -0,0 +1,163 @@
|
|||||||
|
name: Notify
|
||||||
|
|
||||||
|
# Opens an issue when a package fails to update on main, so it shows up in the
|
||||||
|
# notifications on git.felo.gg. One issue per package: a broken package must
|
||||||
|
# not hide behind another one, and a run of only some packages must not close
|
||||||
|
# the issues of the others. A later failure refreshes the issue instead of
|
||||||
|
# commenting, as the schedule would otherwise add one every 6 hours. The next
|
||||||
|
# successful update of that package closes it again.
|
||||||
|
#
|
||||||
|
# Talks to the Gitea API with curl: gh only knows GitHub.
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_run:
|
||||||
|
workflows: [Update AUR packages]
|
||||||
|
types: [completed]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
actions: read
|
||||||
|
issues: write
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: notify
|
||||||
|
cancel-in-progress: false
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
notify:
|
||||||
|
name: Notify
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: >-
|
||||||
|
github.event.workflow_run.event != 'pull_request' &&
|
||||||
|
github.event.workflow_run.head_branch == github.event.repository.default_branch
|
||||||
|
steps:
|
||||||
|
- name: Open, update or close the failure issues
|
||||||
|
env:
|
||||||
|
TOKEN: ${{ github.token }}
|
||||||
|
API: ${{ github.api_url }}/repos/${{ github.repository }}
|
||||||
|
OWNER: ${{ github.repository_owner }}
|
||||||
|
WORKFLOW: ${{ github.event.workflow_run.name || 'Update AUR packages' }}
|
||||||
|
CONCLUSION: ${{ github.event.workflow_run.conclusion }}
|
||||||
|
EVENT: ${{ github.event.workflow_run.event }}
|
||||||
|
RUN_ID: ${{ github.event.workflow_run.id }}
|
||||||
|
RUN_URL: ${{ github.event.workflow_run.html_url }}
|
||||||
|
SHA: ${{ github.event.workflow_run.head_sha }}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
label=ci-failure
|
||||||
|
|
||||||
|
api() {
|
||||||
|
local method=$1 path=$2
|
||||||
|
shift 2
|
||||||
|
curl -fsSL -X "$method" -H "Authorization: token $TOKEN" \
|
||||||
|
-H 'Content-Type: application/json' "$API$path" "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
issues="$(api GET "/issues?state=open&type=issues&labels=$label&limit=50")"
|
||||||
|
|
||||||
|
label_id() {
|
||||||
|
local id
|
||||||
|
id="$(api GET '/labels?limit=50' | jq -r --arg l "$label" '.[] | select(.name == $l) | .id')"
|
||||||
|
if [ -z "$id" ]; then
|
||||||
|
id="$(api POST /labels -d "$(jq -cn --arg l "$label" \
|
||||||
|
'{name: $l, color: "#d73a4a", description: "A package fails to update"}')" | jq -r .id)"
|
||||||
|
fi
|
||||||
|
echo "$id"
|
||||||
|
}
|
||||||
|
|
||||||
|
# The issue title for a job: the package for "update (<package>)",
|
||||||
|
# the workflow for anything else.
|
||||||
|
title_for() {
|
||||||
|
if [[ $1 =~ ^update\ \((.+)\)$ ]]; then
|
||||||
|
echo "${BASH_REMATCH[1]} fails to update"
|
||||||
|
else
|
||||||
|
echo "$WORKFLOW is failing"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_for() {
|
||||||
|
jq -r --arg title "$1" '.[] | select(.title == $title) | .number' <<<"$issues" | head -1
|
||||||
|
}
|
||||||
|
|
||||||
|
# The lines of the failed step leading up to its first error, enough
|
||||||
|
# to see what broke without opening the log. Falls back to the end
|
||||||
|
# of the log.
|
||||||
|
excerpt_for() {
|
||||||
|
local log
|
||||||
|
log="$(api GET "/actions/jobs/$1/logs" |
|
||||||
|
sed -E 's/^[0-9TZ:.-]+ //; s/\x1b\[[0-9;]*m//g')" || return 0
|
||||||
|
awk '/^(##\[group\]|::group::)Run / { out = "" } { out = out $0 "\n" }
|
||||||
|
/^(##\[error\]|::error::)/ { printf "%s", out; found = 1; exit }
|
||||||
|
END { if (!found) exit 1 }' <<<"$log" | tail -40 ||
|
||||||
|
tail -40 <<<"$log"
|
||||||
|
}
|
||||||
|
|
||||||
|
# report <title> <job json, or empty if the run never started>
|
||||||
|
report() {
|
||||||
|
local title=$1 job=$2 line excerpt="" issue body
|
||||||
|
if [ -n "$job" ]; then
|
||||||
|
line="$(jq -r '"- [\(.name)](\(.html_url))" +
|
||||||
|
([.steps[]? | select(.conclusion == "failure") | .name] |
|
||||||
|
if length > 0 then ": " + join(", ") else "" end)' <<<"$job")"
|
||||||
|
excerpt="$(excerpt_for "$(jq -r .id <<<"$job")")"
|
||||||
|
else
|
||||||
|
line="The run did not start ($CONCLUSION)."
|
||||||
|
fi
|
||||||
|
|
||||||
|
body="$(cat <<EOF
|
||||||
|
[$WORKFLOW]($RUN_URL) failed on \`${SHA:0:7}\`, started by \`$EVENT\`.
|
||||||
|
|
||||||
|
$line
|
||||||
|
EOF
|
||||||
|
)"
|
||||||
|
if [ -n "$excerpt" ]; then
|
||||||
|
body="$body
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Log</summary>
|
||||||
|
|
||||||
|
\`\`\`
|
||||||
|
$excerpt
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
</details>"
|
||||||
|
fi
|
||||||
|
|
||||||
|
issue="$(issue_for "$title")"
|
||||||
|
if [ -n "$issue" ]; then
|
||||||
|
api PATCH "/issues/$issue" -d "$(jq -cn --arg b "$body" '{body: $b}')" >/dev/null
|
||||||
|
else
|
||||||
|
api POST /issues -d "$(jq -cn --arg t "$title" --arg b "@$OWNER $body" \
|
||||||
|
--argjson l "$(label_id)" '{title: $t, body: $b, labels: [$l]}')" >/dev/null
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
close() {
|
||||||
|
local issue
|
||||||
|
issue="$(issue_for "$1")"
|
||||||
|
if [ -n "$issue" ]; then
|
||||||
|
api POST "/issues/$issue/comments" \
|
||||||
|
-d "$(jq -cn --arg b "Passing again: $RUN_URL" '{body: $b}')" >/dev/null
|
||||||
|
api PATCH "/issues/$issue" -d '{"state": "closed"}' >/dev/null
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ "$CONCLUSION" = startup_failure ]; then
|
||||||
|
report "$WORKFLOW is failing" ""
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Cancelled and skipped jobs say nothing about a package.
|
||||||
|
page=1
|
||||||
|
while :; do
|
||||||
|
jobs="$(api GET "/actions/runs/$RUN_ID/jobs?limit=50&page=$page" | jq -c '.jobs[]?')"
|
||||||
|
[ -n "$jobs" ] || break
|
||||||
|
while IFS= read -r -u 3 job; do
|
||||||
|
title="$(title_for "$(jq -r .name <<<"$job")")"
|
||||||
|
case "$(jq -r .conclusion <<<"$job")" in
|
||||||
|
success) close "$title" ;;
|
||||||
|
failure | timed_out) report "$title" "$job" ;;
|
||||||
|
esac
|
||||||
|
done 3<<<"$jobs"
|
||||||
|
[ "$(wc -l <<<"$jobs")" -ge 50 ] || break
|
||||||
|
page=$((page + 1))
|
||||||
|
done
|
||||||
@@ -1,10 +1,20 @@
|
|||||||
name: Update AUR packages
|
name: Update AUR packages
|
||||||
|
run-name: ${{ inputs.package && format('Update {0}', inputs.package) || 'Update AUR packages' }}
|
||||||
|
|
||||||
on:
|
on:
|
||||||
schedule:
|
schedule:
|
||||||
# every 6 hours (offset from the full hour to avoid GitHub's load spikes)
|
# every 6 hours, off the full hour
|
||||||
- cron: '37 */6 * * *'
|
- cron: '37 */6 * * *'
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
package:
|
||||||
|
# A few packages instead of all of them: a full run builds every
|
||||||
|
# package in turn, and one near the end of the list waits behind every
|
||||||
|
# source build before it gets its turn.
|
||||||
|
description: 'Only update these package directories, comma-separated (empty: all packages)'
|
||||||
|
type: string
|
||||||
|
required: false
|
||||||
|
default: ''
|
||||||
push:
|
push:
|
||||||
branches: [main]
|
branches: [main]
|
||||||
paths:
|
paths:
|
||||||
@@ -28,10 +38,34 @@ jobs:
|
|||||||
outputs:
|
outputs:
|
||||||
packages: ${{ steps.list.outputs.packages }}
|
packages: ${{ steps.list.outputs.packages }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v7
|
||||||
- id: list
|
- id: list
|
||||||
|
env:
|
||||||
|
PACKAGES: ${{ inputs.package }}
|
||||||
run: |
|
run: |
|
||||||
echo "packages=$(ls -d */PKGBUILD 2>/dev/null | xargs -r -n1 dirname | jq -R . | jq -cs .)" >> "$GITHUB_OUTPUT"
|
if [ -n "$PACKAGES" ]; then
|
||||||
|
# split on commas, trim, drop empty entries and duplicates, keep
|
||||||
|
# the given order (it is the build order)
|
||||||
|
packages=$(jq -cn --arg s "$PACKAGES" '
|
||||||
|
$s | split(",") | map(gsub("^\\s+|\\s+$"; "") | select(. != ""))
|
||||||
|
| reduce .[] as $p ([]; if any(.[]; . == $p) then . else . + [$p] end)')
|
||||||
|
if [ "$packages" = "[]" ]; then
|
||||||
|
echo "::error::no package name in '$PACKAGES'"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
# report every unknown name at once, not just the first
|
||||||
|
missing=0
|
||||||
|
while IFS= read -r p; do
|
||||||
|
if [ ! -f "$p/PKGBUILD" ]; then
|
||||||
|
echo "::error::there is no package directory named '$p'"
|
||||||
|
missing=1
|
||||||
|
fi
|
||||||
|
done < <(jq -r '.[]' <<< "$packages")
|
||||||
|
[ "$missing" = 0 ] || exit 1
|
||||||
|
echo "packages=$packages" >> "$GITHUB_OUTPUT"
|
||||||
|
else
|
||||||
|
echo "packages=$(ls -d */PKGBUILD 2>/dev/null | xargs -r -n1 dirname | jq -R . | jq -cs .)" >> "$GITHUB_OUTPUT"
|
||||||
|
fi
|
||||||
|
|
||||||
update:
|
update:
|
||||||
needs: discover
|
needs: discover
|
||||||
@@ -45,17 +79,18 @@ jobs:
|
|||||||
max-parallel: 1
|
max-parallel: 1
|
||||||
matrix:
|
matrix:
|
||||||
package: ${{ fromJson(needs.discover.outputs.packages) }}
|
package: ${{ fromJson(needs.discover.outputs.packages) }}
|
||||||
env:
|
|
||||||
GH_TOKEN: ${{ github.token }}
|
|
||||||
steps:
|
steps:
|
||||||
|
# nodejs: actions/checkout is a JavaScript action, and the Gitea runner
|
||||||
|
# runs it inside this container
|
||||||
- name: Install base tooling
|
- name: Install base tooling
|
||||||
run: pacman -Syu --noconfirm --needed git openssh github-cli jq zstd
|
run: pacman -Syu --noconfirm --needed git openssh jq zstd nodejs
|
||||||
|
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v7
|
||||||
|
|
||||||
- name: Update ${{ matrix.package }}
|
- name: Update ${{ matrix.package }}
|
||||||
env:
|
env:
|
||||||
AUR_SSH_PRIVATE_KEY: ${{ secrets.AUR_SSH_PRIVATE_KEY }}
|
AUR_SSH_PRIVATE_KEY: ${{ secrets.AUR_SSH_PRIVATE_KEY }}
|
||||||
|
GITHUB_API_TOKEN: ${{ secrets.GITHUB_API_TOKEN }}
|
||||||
AUR_GIT_NAME: ${{ vars.AUR_GIT_NAME }}
|
AUR_GIT_NAME: ${{ vars.AUR_GIT_NAME }}
|
||||||
AUR_GIT_EMAIL: ${{ secrets.AUR_GIT_EMAIL }}
|
AUR_GIT_EMAIL: ${{ secrets.AUR_GIT_EMAIL }}
|
||||||
run: bash scripts/update-package.sh "${{ matrix.package }}"
|
run: bash scripts/update-package.sh "${{ matrix.package }}"
|
||||||
@@ -1,8 +1,10 @@
|
|||||||
# makepkg build leftovers and downloaded/built artifacts
|
# makepkg build leftovers and downloaded/built artifacts
|
||||||
*.tar.zst
|
*.tar.zst
|
||||||
*.tar.gz
|
*.tar.gz
|
||||||
|
*.tar.bz2
|
||||||
*.pkg.tar.*
|
*.pkg.tar.*
|
||||||
*/src/
|
*/src/
|
||||||
*/pkg/
|
*/pkg/
|
||||||
*.deb
|
*.deb
|
||||||
*.AppImage
|
*.AppImage
|
||||||
|
*.flatpak
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
# CLAUDE.md
|
||||||
|
|
||||||
|
## Style
|
||||||
|
|
||||||
|
- Keep everything short: replies, explanations, comments, docs.
|
||||||
|
- Use simple English: short sentences, common words.
|
||||||
|
- Avoid em dashes (—). Do not just swap them for "-" either. Rewrite the sentence instead, for
|
||||||
|
example with a comma, a colon, brackets or two sentences.
|
||||||
|
|
||||||
|
## Commits
|
||||||
|
|
||||||
|
- English only.
|
||||||
|
- Subject: `<package>: <what changed>`, the way CI writes it, for example
|
||||||
|
`plezy-bin: update to 2.21.0-1` or `bottles-opener: new package`. Several packages at once:
|
||||||
|
list them separated by commas.
|
||||||
|
- Subject as short as possible. Imperative, lowercase, no trailing period.
|
||||||
|
- Body only when something genuinely cannot be inferred from the diff.
|
||||||
|
- Never add `Co-Authored-By`, "Generated with" or any other AI attribution to commits or PR descriptions.
|
||||||
|
|
||||||
|
## Packages
|
||||||
|
|
||||||
|
- Read README.md first. The ground rule there decides what a package may do: this repository never
|
||||||
|
hosts a binary of our own, and `-bin` is only for what upstream published.
|
||||||
|
- One directory per package with `PKGBUILD` and `pkg.sh`. `pkg.sh` tells CI how to find the newest
|
||||||
|
version and how to refresh the checksums.
|
||||||
|
- Never bump `pkgver` or checksums by hand: CI does that every six hours.
|
||||||
@@ -1,50 +1,85 @@
|
|||||||
# PKGBUILDS
|
# PKGBUILDS
|
||||||
|
|
||||||
Automated `-bin` packages for the [AUR](https://aur.archlinux.org), kept up to
|
Automated AUR packages, kept up to date by Gitea Actions on
|
||||||
date by GitHub Actions.
|
[git.felo.gg](https://git.felo.gg/Felitendo/PKGBUILDS).
|
||||||
|
|
||||||
Every 6 hours the [update workflow](.github/workflows/update.yml) checks each
|
Every 6 hours the [update workflow](.github/workflows/update.yml) checks each
|
||||||
package's upstream for a new release. When one is found it:
|
package's upstream for a new release. When one is found it:
|
||||||
|
|
||||||
1. builds the software in an Arch Linux container,
|
1. updates the `PKGBUILD` (pkgver/pkgrel/sha256sums),
|
||||||
2. publishes the resulting install tree as a `.tar.zst` asset on a GitHub
|
2. test-builds it with `makepkg` and regenerates `.SRCINFO`,
|
||||||
release of **this** repository (tag `<pkgname>-<version>`),
|
3. commits the changes back to this repository, and
|
||||||
3. updates the `PKGBUILD` (pkgver/pkgrel/sha256sums), test-builds it with
|
4. pushes the package files to the AUR.
|
||||||
`makepkg` and regenerates `.SRCINFO`,
|
|
||||||
4. commits the changes back to this repository,
|
|
||||||
5. pushes `PKGBUILD` + `.SRCINFO` to the AUR, and
|
|
||||||
6. deletes the package's superseded releases (older versions, tag included).
|
|
||||||
|
|
||||||
The AUR packages themselves only download the prebuilt asset from step 2, so
|
If a package fails to update, the [notify workflow](.github/workflows/notify.yml)
|
||||||
users don't need any build dependencies.
|
opens an issue for it. The issue closes once that package updates again.
|
||||||
|
|
||||||
|
## Ground rule
|
||||||
|
|
||||||
|
**This repository never hosts a binary.** Every `PKGBUILD` sources what
|
||||||
|
*upstream* published — a release tarball, `.deb`, wheel or AppImage — and
|
||||||
|
either repackages it (`-bin`) or builds it (no suffix), exactly like any
|
||||||
|
hand-written AUR package would. CI only bumps `pkgver` and the checksums.
|
||||||
|
|
||||||
|
This is not a style preference. The
|
||||||
|
[AUR submission guidelines](https://wiki.archlinux.org/title/AUR_submission_guidelines#Rules_of_submission)
|
||||||
|
say:
|
||||||
|
|
||||||
|
> Packages that use **prebuilt** deliverables, when the sources are available,
|
||||||
|
> must use the `-bin` suffix. […] The AUR should not contain the binary
|
||||||
|
> tarball created by makepkg
|
||||||
|
|
||||||
|
A `-bin` package repackages what upstream ships. Building the software
|
||||||
|
yourself, publishing the result as a release asset and having the AUR
|
||||||
|
`PKGBUILD` download *that* makes this repository an unofficial binary
|
||||||
|
repository — users can no longer verify that the package matches what
|
||||||
|
upstream released. Packages set up that way were removed from the AUR in
|
||||||
|
July 2026; do not reintroduce the pattern.
|
||||||
|
|
||||||
|
If upstream ships no Linux binary, there are exactly two options: build from
|
||||||
|
source in the `PKGBUILD` (and drop the `-bin` suffix), or don't package it.
|
||||||
|
|
||||||
## Packages
|
## Packages
|
||||||
|
|
||||||
| Package | Upstream | AUR |
|
| Package | Upstream | Upstream deliverable | AUR |
|
||||||
|---|---|---|
|
|---|---|---|---|
|
||||||
| `timetable-bin` | [ostfriese4/untis](https://codeberg.org/ostfriese4/untis) — "Timetable", a GTK4 + LibAdwaita client for WebUntis | [timetable-bin](https://aur.archlinux.org/packages/timetable-bin) |
|
| `bottles-opener` | [LoonixTools/bottles-opener](https://git.felo.gg/LoonixTools/bottles-opener) — double-click a file and it opens in its Windows program inside Bottles, with the file types and icons from the bottle's registry | *built from source* | [bottles-opener](https://aur.archlinux.org/packages/bottles-opener) |
|
||||||
| `fluxer-bin` | [fluxer.app](https://fluxer.app) — Fluxer desktop client (Electron) | [fluxer-bin](https://aur.archlinux.org/packages/fluxer-bin) |
|
| `bt-volume-step` | [LoonixTools/bt-volume-step](https://git.felo.gg/LoonixTools/bt-volume-step) — corrects the coarse internal volume grid of Bluetooth audio devices on PipeWire | *built from source* | [bt-volume-step](https://aur.archlinux.org/packages/bt-volume-step) |
|
||||||
| `chromium-widevine-helper-bin` | [GloriousEggroll/chromium-widevine-helper](https://github.com/GloriousEggroll/chromium-widevine-helper) — extension + native helper installing Google's Widevine CDM into Chromium-based browser profiles | [chromium-widevine-helper-bin](https://aur.archlinux.org/packages/chromium-widevine-helper-bin) |
|
| `cachy-auto-update` | [LoonixTools/cachy-auto-update](https://git.felo.gg/LoonixTools/cachy-auto-update) — unattended background updates for CachyOS (pacman, AUR, Flatpak, AppImages) | *built from source* | [cachy-auto-update](https://aur.archlinux.org/packages/cachy-auto-update) |
|
||||||
| `sharpemu-bin` | [sharpemu/sharpemu](https://github.com/sharpemu/sharpemu) — experimental PlayStation 5 emulator | [sharpemu-bin](https://aur.archlinux.org/packages/sharpemu-bin) |
|
| `capture-studio-bin` | [tenzen.studio](https://tenzen.studio): Capture Studio by Tenzen Studio, screen recorder and editor for product demos (proprietary Electron app). Called `tenzen-studio-bin` before | Flatpak bundle | [capture-studio-bin](https://aur.archlinux.org/packages/capture-studio-bin) |
|
||||||
| `thonny-bin` | [thonny/thonny](https://github.com/thonny/thonny) — Python IDE for beginners (bundles a standalone CPython + tcl/tk) | [thonny-bin](https://aur.archlinux.org/packages/thonny-bin) |
|
| `chiaki-ng-bin` | [streetpea/chiaki-ng](https://github.com/streetpea/chiaki-ng) — PlayStation Remote Play client (Qt6) | AppImage | [chiaki-ng-bin](https://aur.archlinux.org/packages/chiaki-ng-bin) |
|
||||||
| `gearlever-bin` | [mijorus/gearlever](https://github.com/mijorus/gearlever) — "Gear Lever", a GTK4 + LibAdwaita AppImage manager | [gearlever-bin](https://aur.archlinux.org/packages/gearlever-bin) |
|
| `chromium-widevine-helper` | [GloriousEggroll/chromium-widevine-helper](https://github.com/GloriousEggroll/chromium-widevine-helper) — extension + native helper installing Google's Widevine CDM into Chromium-based browser profiles | *no build step* | [chromium-widevine-helper](https://aur.archlinux.org/packages/chromium-widevine-helper) |
|
||||||
| `bottles-bin` | [bottlesdevs/Bottles](https://github.com/bottlesdevs/Bottles) — wine/proton prefix manager (GTK4 + LibAdwaita) | [bottles-bin](https://aur.archlinux.org/packages/bottles-bin) |
|
| `concat` | [jub0t/Concat](https://github.com/jub0t/Concat) — free and open-source CapCut replacement (a Slint window over a Rust video engine) | *built from source* | [concat](https://aur.archlinux.org/packages/concat) |
|
||||||
| `faugus-launcher-bin` | [Faugus/faugus-launcher](https://github.com/Faugus/faugus-launcher) — launcher for Windows games via UMU-Launcher | [faugus-launcher-bin](https://aur.archlinux.org/packages/faugus-launcher-bin) |
|
| `concat-bin` | [jub0t/Concat](https://github.com/jub0t/Concat) — prebuilt release of `concat` | `.deb` | [concat-bin](https://aur.archlinux.org/packages/concat-bin) |
|
||||||
| `protonplus-bin` | [Vysp3r/ProtonPlus](https://github.com/Vysp3r/ProtonPlus) — compatibility-tools manager (Vala/GTK4) | [protonplus-bin](https://aur.archlinux.org/packages/protonplus-bin) |
|
| `concat-git` | [jub0t/Concat](https://github.com/jub0t/Concat) — `main` branch of `concat` | *built from source* | [concat-git](https://aur.archlinux.org/packages/concat-git) |
|
||||||
| `zapzap-bin` | [rafatosta/zapzap](https://github.com/rafatosta/zapzap) — WhatsApp desktop client (PyQt6 + WebEngine) | [zapzap-bin](https://aur.archlinux.org/packages/zapzap-bin) |
|
| `face-unlock` | [LoonixTools/face-unlock](https://git.felo.gg/LoonixTools/face-unlock): Face ID for Linux, for the lock screen, sudo and admin prompts on Plasma, GNOME, Hyprland and Niri, with a photo check (C++/Qt6, OpenCV). Called `plasma-face-unlock` before 2.0.0 | *built from source* | [face-unlock](https://aur.archlinux.org/packages/face-unlock) |
|
||||||
| `vacuumtube-bin` | [shy1132/VacuumTube](https://github.com/shy1132/VacuumTube) — YouTube Leanback (TV UI) with built-in adblocker (repackaged upstream deb) | [vacuumtube-bin](https://aur.archlinux.org/packages/vacuumtube-bin) |
|
| `face-unlock-bin` | [LoonixTools/face-unlock](https://git.felo.gg/LoonixTools/face-unlock): prebuilt release of `face-unlock`, with OpenCV linked in | tarball (built on Arch) | [face-unlock-bin](https://aur.archlinux.org/packages/face-unlock-bin) |
|
||||||
| `wiiudownloader-bin` | [Xpl0itU/WiiUDownloader](https://github.com/Xpl0itU/WiiUDownloader) — Wii U title downloader (Go + GTK3) | [wiiudownloader-bin](https://aur.archlinux.org/packages/wiiudownloader-bin) |
|
| `faugus-launcher-bin` | [Faugus/faugus-launcher](https://github.com/Faugus/faugus-launcher) — launcher for Windows games via UMU-Launcher | `.deb` (`all`) | [faugus-launcher-bin](https://aur.archlinux.org/packages/faugus-launcher-bin) |
|
||||||
| `trayscale-bin` | [DeedleFake/trayscale](https://github.com/DeedleFake/trayscale) — GUI for the Tailscale CLI (Go + GTK4) | [trayscale-bin](https://aur.archlinux.org/packages/trayscale-bin) |
|
| `fluxer-bin` | [fluxer.app](https://fluxer.app) — Fluxer desktop client (Electron) | tarball | [fluxer-bin](https://aur.archlinux.org/packages/fluxer-bin) |
|
||||||
| `linux-wallpaperengine-bin` | [Almamu/linux-wallpaperengine](https://github.com/Almamu/linux-wallpaperengine) — Wallpaper Engine on Linux (commit snapshots, bundles CEF) | [linux-wallpaperengine-bin](https://aur.archlinux.org/packages/linux-wallpaperengine-bin) |
|
| `kitty-tune-bin` | [alan7383/KittyTuneDesktop](https://github.com/alan7383/KittyTuneDesktop) — SoundCloud and YouTube music player (Kotlin/Compose Multiplatform) | `.deb` | [kitty-tune-bin](https://aur.archlinux.org/packages/kitty-tune-bin) |
|
||||||
| `librepods-bin` | [librepods-org/librepods](https://github.com/librepods-org/librepods) — AirPods integration for Linux (Qt6) | [librepods-bin](https://aur.archlinux.org/packages/librepods-bin) |
|
| `lunar-client-bin` | [lunarclient.com](https://lunarclient.com) — Minecraft PvP modpack launcher | AppImage | [lunar-client-bin](https://aur.archlinux.org/packages/lunar-client-bin) |
|
||||||
| `planify-bin` | [alainm23/planify](https://github.com/alainm23/planify) — task manager with Todoist/Nextcloud support (Vala/GTK4, bundles gxml) | [planify-bin](https://aur.archlinux.org/packages/planify-bin) |
|
| `middleclick-autoscroll` | [LoonixTools/middleclick-autoscroll](https://git.felo.gg/LoonixTools/middleclick-autoscroll) — enables middle-click autoscroll in every application that supports it | *built from source* | [middleclick-autoscroll](https://aur.archlinux.org/packages/middleclick-autoscroll) |
|
||||||
| `modrinth-app-bin` | [modrinth/code](https://github.com/modrinth/code) — Modrinth's Minecraft mod manager/launcher (repackaged upstream deb) | [modrinth-app-bin](https://aur.archlinux.org/packages/modrinth-app-bin) |
|
| `modrinth-app-bin` | [modrinth/code](https://github.com/modrinth/code) — Minecraft mod manager/launcher | `.deb` | [modrinth-app-bin](https://aur.archlinux.org/packages/modrinth-app-bin) |
|
||||||
| `bazaar-bin` | [bazaar-org/bazaar](https://github.com/bazaar-org/bazaar) — GNOME app store for flatpaks/Flathub | [bazaar-bin](https://aur.archlinux.org/packages/bazaar-bin) |
|
| `modrinth-enhanced` | [Felitendo/Modrinth-Enhanced](https://git.felo.gg/Felitendo/Modrinth-Enhanced) — Modrinth App without ads or telemetry, with offline and Ely.by accounts (a patch series on top of each Modrinth App release) | *built from source* | [modrinth-enhanced](https://aur.archlinux.org/packages/modrinth-enhanced) |
|
||||||
| `snapx-bin` | [SnapXL/SnapX](https://github.com/SnapXL/SnapX) — ShareX-fork screenshot/sharing tool (repackaged upstream bundle) | [snapx-bin](https://aur.archlinux.org/packages/snapx-bin) |
|
| `modrinth-enhanced-bin` | [Felitendo/Modrinth-Enhanced](https://git.felo.gg/Felitendo/Modrinth-Enhanced) — prebuilt release of `modrinth-enhanced` | `.deb` | [modrinth-enhanced-bin](https://aur.archlinux.org/packages/modrinth-enhanced-bin) |
|
||||||
| `chiaki-ng-bin` | [streetpea/chiaki-ng](https://github.com/streetpea/chiaki-ng) — PlayStation Remote Play client (Qt6) | [chiaki-ng-bin](https://aur.archlinux.org/packages/chiaki-ng-bin) |
|
| `moondeckbuddy` | [FrogTheFrog/moondeck-buddy](https://github.com/FrogTheFrog/moondeck-buddy) — host companion of the MoonDeck Steam Deck plugin (C++/Qt6) | *built from source* | [moondeckbuddy](https://aur.archlinux.org/packages/moondeckbuddy) |
|
||||||
| `gnome-network-displays-bin` | [GNOME/gnome-network-displays](https://gitlab.gnome.org/GNOME/gnome-network-displays) — GNOME screencasting (Miracast/Chromecast) | [gnome-network-displays-bin](https://aur.archlinux.org/packages/gnome-network-displays-bin) |
|
| `moondeckbuddy-bin` | [FrogTheFrog/moondeck-buddy](https://github.com/FrogTheFrog/moondeck-buddy) — prebuilt release of `moondeckbuddy` | AppImage | *not published yet* |
|
||||||
| `waydroid-helper-bin` | [ayasa520/waydroid-helper](https://github.com/ayasa520/waydroid-helper) — GTK4 GUI for Waydroid configuration and extensions | [waydroid-helper-bin](https://aur.archlinux.org/packages/waydroid-helper-bin) |
|
| `moonlight-vrr` | [Nonary/moonlight-qt](https://github.com/Nonary/moonlight-qt): fork of the Moonlight game streaming client with smooth VRR pacing and the PyroWave codec (C++/Qt6) | *built from source* | [moonlight-vrr](https://aur.archlinux.org/packages/moonlight-vrr) |
|
||||||
| `lunar-client-bin` | [lunarclient.com](https://lunarclient.com) — Minecraft PvP modpack launcher (upstream AppImage) | [lunar-client-bin](https://aur.archlinux.org/packages/lunar-client-bin) |
|
| `moonlight-vrr-bin` | [Nonary/moonlight-qt](https://github.com/Nonary/moonlight-qt): prebuilt release of `moonlight-vrr`, built by upstream without Wayland support (runs through XWayland) | AppImage | [moonlight-vrr-bin](https://aur.archlinux.org/packages/moonlight-vrr-bin) |
|
||||||
|
| `nextcloud-native` | [Obiente/native](https://github.com/Obiente/native) — adaptive native Nextcloud client for files, media and installed server apps (Compose Multiplatform, unofficial) | *built from source* | [nextcloud-native](https://aur.archlinux.org/packages/nextcloud-native) |
|
||||||
|
| `nextcloud-native-bin` | [Obiente/native](https://github.com/Obiente/native) — prebuilt release of `nextcloud-native` | `.deb` | [nextcloud-native-bin](https://aur.archlinux.org/packages/nextcloud-native-bin) |
|
||||||
|
| `nextcloud-native-git` | [Obiente/native](https://github.com/Obiente/native) — `main` branch of `nextcloud-native` | *built from source* | [nextcloud-native-git](https://aur.archlinux.org/packages/nextcloud-native-git) |
|
||||||
|
| `plezy-bin` | [edde746/plezy](https://github.com/edde746/plezy) — Plex, Jellyfin and Emby client (Flutter); the source package [lives in `extra`](https://archlinux.org/packages/extra/x86_64/plezy/) | `.deb` | [plezy-bin](https://aur.archlinux.org/packages/plezy-bin) |
|
||||||
|
| `schist` | [Infrawrench/schist](https://github.com/Infrawrench/schist): layered image editor with PSD and Affinity support (Rust/gpui, alpha) | *built from source* | [schist](https://aur.archlinux.org/packages/schist) |
|
||||||
|
| `schist-bin` | [Infrawrench/schist](https://github.com/Infrawrench/schist): prebuilt release of `schist` | `.pkg.tar.zst` | [schist-bin](https://aur.archlinux.org/packages/schist-bin) |
|
||||||
|
| `sharpemu-bin` | [sharpemu/sharpemu](https://github.com/sharpemu/sharpemu) — experimental PlayStation 5 emulator | tarball | [sharpemu-bin](https://aur.archlinux.org/packages/sharpemu-bin) |
|
||||||
|
| `snapx-bin` | [SnapXL/SnapX](https://github.com/SnapXL/SnapX) — ShareX-fork screenshot/sharing tool | self-contained tarball | [snapx-bin](https://aur.archlinux.org/packages/snapx-bin) |
|
||||||
|
| `untix` | [ostfriese4/untix](https://codeberg.org/ostfriese4/untix): "Timetable", a GTK4 + LibAdwaita client for WebUntis. Called `untis` and `timetable` on the AUR before | *built from source* | [untix](https://aur.archlinux.org/packages/untix) |
|
||||||
|
| `untix-git` | [ostfriese4/untix](https://codeberg.org/ostfriese4/untix): `main` branch of `untix` | *built from source* | [untix-git](https://aur.archlinux.org/packages/untix-git) |
|
||||||
|
| `vacuumtube-bin` | [shy1132/VacuumTube](https://github.com/shy1132/VacuumTube) — YouTube Leanback (TV UI) with built-in adblocker | `.deb` | [vacuumtube-bin](https://aur.archlinux.org/packages/vacuumtube-bin) |
|
||||||
|
| `waydroid-helper-bin` | [waydroid-helper/waydroid-helper](https://github.com/waydroid-helper/waydroid-helper) — GTK4 GUI for Waydroid configuration and extensions | AppImage | [waydroid-helper-bin](https://aur.archlinux.org/packages/waydroid-helper-bin) |
|
||||||
|
| `wiiudownloader-bin` | [Xpl0itU/WiiUDownloader](https://github.com/Xpl0itU/WiiUDownloader) — Wii U title downloader (Go + GTK4) | AppImage | [wiiudownloader-bin](https://aur.archlinux.org/packages/wiiudownloader-bin) |
|
||||||
|
| `zapzap-bin` | [rafatosta/zapzap](https://github.com/rafatosta/zapzap) — WhatsApp desktop client (PyQt6 + WebEngine) | wheel | [zapzap-bin](https://aur.archlinux.org/packages/zapzap-bin) |
|
||||||
|
|
||||||
## Setup (one-time)
|
## Setup (one-time)
|
||||||
|
|
||||||
@@ -52,37 +87,61 @@ users don't need any build dependencies.
|
|||||||
public key to it (AUR account settings).
|
public key to it (AUR account settings).
|
||||||
2. Add the matching **private** key as a repository secret named
|
2. Add the matching **private** key as a repository secret named
|
||||||
`AUR_SSH_PRIVATE_KEY`
|
`AUR_SSH_PRIVATE_KEY`
|
||||||
(Settings → Secrets and variables → Actions → New repository secret).
|
(Settings → Actions → Secrets → Add secret), **base64-encoded on one line**
|
||||||
|
(`base64 -w0 < key`). The Gitea runner prints each step's environment and
|
||||||
|
does not mask a multi-line secret, so a plain key would end up in the log.
|
||||||
3. Optionally set the repository variable `AUR_GIT_NAME` and the repository
|
3. Optionally set the repository variable `AUR_GIT_NAME` and the repository
|
||||||
**secret** `AUR_GIT_EMAIL` to control the commit identity used on the AUR
|
**secret** `AUR_GIT_EMAIL` to control the commit identity used on the AUR
|
||||||
(defaults: `Felitendo` / the maintainer's GitHub noreply address).
|
(defaults: `Felitendo` / the maintainer's old GitHub noreply address).
|
||||||
|
4. Optionally add a GitHub token (no scopes needed) as the secret
|
||||||
|
`GITHUB_API_TOKEN`. Packages ask the GitHub API about upstream releases;
|
||||||
|
without a token those calls are anonymous and share 60 per hour.
|
||||||
|
|
||||||
|
The runner needs the `ubuntu-latest` label and Docker: every package is built
|
||||||
|
in an `archlinux:base-devel` container.
|
||||||
|
|
||||||
The first push to `ssh://aur@aur.archlinux.org/<pkgname>.git` creates the AUR
|
The first push to `ssh://aur@aur.archlinux.org/<pkgname>.git` creates the AUR
|
||||||
package automatically.
|
package automatically.
|
||||||
|
|
||||||
## Adding a package
|
## Adding a package
|
||||||
|
|
||||||
Create a new directory named after the AUR package containing:
|
Check first that upstream actually publishes a Linux binary, that the package
|
||||||
|
is not already in the **official repositories** (the AUR rejects the push
|
||||||
|
outright: "package already provided by [extra]"), and that the AUR does not
|
||||||
|
already carry an equivalent package — a `-bin` next to a maintained
|
||||||
|
source package is fine, a second copy of the same thing is not.
|
||||||
|
|
||||||
- **`PKGBUILD`** — sources the prebuilt asset from
|
Then create a directory named after the AUR package containing:
|
||||||
`https://github.com/Felitendo/PKGBUILDS/releases/download/<pkgname>-<pkgver>/<pkgname>-<pkgver>.tar.zst`.
|
|
||||||
`pkgver`, `pkgrel` and `sha256sums` are maintained by CI.
|
|
||||||
- **`pkg.sh`** — bash sourced by [scripts/update-package.sh](scripts/update-package.sh).
|
|
||||||
Always provides `latest_version` (prints the latest upstream version, no
|
|
||||||
`v` prefix), plus one of two modes:
|
|
||||||
- *upstream has no binaries* (e.g. `timetable-bin`): define
|
|
||||||
`build_artifact <version> <output-file>` (build upstream and write the
|
|
||||||
install tree as a tarball containing `usr/`) and `BUILD_DEPS` (array of
|
|
||||||
Arch packages needed to build). CI hosts the result as a GitHub release
|
|
||||||
asset which the PKGBUILD downloads.
|
|
||||||
- *upstream hosts binaries* (e.g. `fluxer-bin`): define
|
|
||||||
`refresh_checksums <version> <pkgbuild-path>` which updates the
|
|
||||||
`sha256sums*` lines for the new version. The PKGBUILD sources upstream
|
|
||||||
URLs directly and nothing is hosted here.
|
|
||||||
|
|
||||||
Other local source files in the directory (`.desktop` files, etc.) are
|
- **`PKGBUILD`** — sources upstream's release URLs directly. `pkgver`,
|
||||||
|
`pkgrel` and `sha256sums` are maintained by CI, so keep `sha256sums` on a
|
||||||
|
single line.
|
||||||
|
- **`pkg.sh`** — bash sourced by [scripts/update-package.sh](scripts/update-package.sh),
|
||||||
|
defining:
|
||||||
|
- `latest_version` — prints the latest upstream version, no `v` prefix. A
|
||||||
|
channel that has stopped pointing at a release can return `75`
|
||||||
|
(`EX_TEMPFAIL`) instead: the run then warns, keeps the version the
|
||||||
|
`PKGBUILD` has and carries on, so packaging changes still reach the AUR
|
||||||
|
(`fluxer-bin`).
|
||||||
|
- `refresh_checksums <version> <pkgbuild-path>` — updates the `sha256sums*`
|
||||||
|
lines for that version. If the asset name carries build metadata that does
|
||||||
|
not follow from `pkgver` (see `snapx-bin`, `faugus-launcher-bin`), resolve
|
||||||
|
it via the GitHub API here and sync an `_asset` variable in the `PKGBUILD`
|
||||||
|
too.
|
||||||
|
- `BUILD_DEPS` — optional array of Arch packages to install before the CI
|
||||||
|
test build; only needed by packages that build from source or need a
|
||||||
|
tool to unpack upstream's deliverable (`capture-studio-bin`: `ostree`).
|
||||||
|
- `AUR_PUBLISH` — optional; set to `false` to keep a package out of the AUR
|
||||||
|
while it is still being prepared. Everything else still runs, so the
|
||||||
|
`PKGBUILD` is kept current and test-built; only the publishing waits.
|
||||||
|
Flip it to `true` to go live (`moondeckbuddy-bin`). `face-unlock-bin` sets it
|
||||||
|
itself: it goes live with the first release that has its tarball.
|
||||||
|
|
||||||
|
Other local source files in the directory (`.desktop` files, patches, …) are
|
||||||
pushed to the AUR alongside `PKGBUILD` and `.SRCINFO`.
|
pushed to the AUR alongside `PKGBUILD` and `.SRCINFO`.
|
||||||
|
|
||||||
The workflow discovers package directories automatically. Trigger a run
|
The workflow discovers package directories automatically. Trigger a run
|
||||||
manually via *Actions → Update AUR packages → Run workflow* to publish it
|
manually via *Actions → Update AUR packages → Run workflow* to publish it
|
||||||
immediately.
|
immediately. To update only some packages, enter their directory names,
|
||||||
|
separated by commas (e.g. `concat, plezy-bin`); leave the field empty to update
|
||||||
|
all of them.
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
pkgbase = bazaar-bin
|
|
||||||
pkgdesc = App store for GNOME with a focus on flatpaks and Flathub (prebuilt)
|
|
||||||
pkgver = 0.9.1
|
|
||||||
pkgrel = 1
|
|
||||||
url = https://github.com/bazaar-org/bazaar
|
|
||||||
arch = x86_64
|
|
||||||
license = GPL-3.0-only
|
|
||||||
depends = appstream
|
|
||||||
depends = cairo
|
|
||||||
depends = dconf
|
|
||||||
depends = flatpak
|
|
||||||
depends = glib2
|
|
||||||
depends = glycin
|
|
||||||
depends = glycin-gtk4
|
|
||||||
depends = graphene
|
|
||||||
depends = gtk4
|
|
||||||
depends = gtksourceview5
|
|
||||||
depends = json-glib
|
|
||||||
depends = libadwaita
|
|
||||||
depends = libdex
|
|
||||||
depends = libheif
|
|
||||||
depends = libmalcontent
|
|
||||||
depends = libproxy
|
|
||||||
depends = libsecret
|
|
||||||
depends = libsoup3
|
|
||||||
depends = libxmlb
|
|
||||||
depends = libyaml
|
|
||||||
depends = md4c
|
|
||||||
depends = pango
|
|
||||||
depends = webkitgtk-6.0
|
|
||||||
depends = hicolor-icon-theme
|
|
||||||
optdepends = krunner-bazaar: krunner integration
|
|
||||||
optdepends = malcontent: parental controls
|
|
||||||
provides = bazaar
|
|
||||||
conflicts = bazaar
|
|
||||||
source = bazaar-bin-0.9.1-1.tar.zst::https://github.com/Felitendo/PKGBUILDS/releases/download/bazaar-bin-0.9.1/bazaar-bin-0.9.1.tar.zst
|
|
||||||
sha256sums = 236a8b672a9a67de9a240450f527b119bb4cbdfa0533e49578589fe83638e3dc
|
|
||||||
|
|
||||||
pkgname = bazaar-bin
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
# Maintainer: Felitendo
|
|
||||||
# This PKGBUILD is updated automatically:
|
|
||||||
# https://github.com/Felitendo/PKGBUILDS
|
|
||||||
|
|
||||||
pkgname=bazaar-bin
|
|
||||||
pkgver=0.9.1
|
|
||||||
pkgrel=1
|
|
||||||
pkgdesc="App store for GNOME with a focus on flatpaks and Flathub (prebuilt)"
|
|
||||||
arch=('x86_64')
|
|
||||||
url="https://github.com/bazaar-org/bazaar"
|
|
||||||
license=('GPL-3.0-only')
|
|
||||||
depends=('appstream' 'cairo' 'dconf' 'flatpak' 'glib2' 'glycin' 'glycin-gtk4'
|
|
||||||
'graphene' 'gtk4' 'gtksourceview5' 'json-glib' 'libadwaita' 'libdex'
|
|
||||||
'libheif' 'libmalcontent' 'libproxy' 'libsecret' 'libsoup3' 'libxmlb'
|
|
||||||
'libyaml' 'md4c' 'pango' 'webkitgtk-6.0' 'hicolor-icon-theme')
|
|
||||||
optdepends=('krunner-bazaar: krunner integration'
|
|
||||||
'malcontent: parental controls')
|
|
||||||
provides=('bazaar')
|
|
||||||
conflicts=('bazaar')
|
|
||||||
source=("${pkgname}-${pkgver}-${pkgrel}.tar.zst::https://github.com/Felitendo/PKGBUILDS/releases/download/${pkgname}-${pkgver}/${pkgname}-${pkgver}.tar.zst")
|
|
||||||
sha256sums=('236a8b672a9a67de9a240450f527b119bb4cbdfa0533e49578589fe83638e3dc')
|
|
||||||
|
|
||||||
package() {
|
|
||||||
cp -a "$srcdir/usr" "$pkgdir/"
|
|
||||||
}
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
# bazaar-bin - prebuilt package of https://github.com/bazaar-org/bazaar
|
|
||||||
# (GNOME app store focused on flatpaks/Flathub, C + GTK4/blueprint).
|
|
||||||
#
|
|
||||||
# Upstream tags releases but ships no binaries, so build_artifact() builds
|
|
||||||
# from the release tarball.
|
|
||||||
|
|
||||||
UPSTREAM_REPO="bazaar-org/bazaar"
|
|
||||||
|
|
||||||
# Installed in CI (pacman) before build_artifact runs.
|
|
||||||
BUILD_DEPS=(meson ninja blueprint-compiler glib2-devel python-babel gettext
|
|
||||||
gobject-introspection appstream flatpak gtk4 libadwaita
|
|
||||||
gtksourceview5 libdex glycin glycin-gtk4 webkitgtk-6.0 json-glib
|
|
||||||
libxmlb libyaml md4c libmalcontent libsecret libsoup3 libproxy
|
|
||||||
libheif)
|
|
||||||
|
|
||||||
latest_version() {
|
|
||||||
gh api "repos/$UPSTREAM_REPO/releases/latest" --jq '.tag_name' | sed 's/^v//'
|
|
||||||
}
|
|
||||||
|
|
||||||
# build_artifact <version> <output-file>
|
|
||||||
build_artifact() {
|
|
||||||
local ver="$1" outfile="$2"
|
|
||||||
local workdir destdir srctree
|
|
||||||
workdir="$(mktemp -d)"
|
|
||||||
destdir="$(mktemp -d)"
|
|
||||||
|
|
||||||
curl -sfL "https://github.com/$UPSTREAM_REPO/archive/refs/tags/v$ver.tar.gz" | tar -xz -C "$workdir"
|
|
||||||
srctree="$workdir/bazaar-$ver"
|
|
||||||
|
|
||||||
meson setup "$workdir/build" "$srctree" --prefix=/usr --buildtype=release
|
|
||||||
meson install -C "$workdir/build" --destdir "$destdir"
|
|
||||||
|
|
||||||
# These caches are generated by pacman hooks; shipping them would cause
|
|
||||||
# file conflicts on install.
|
|
||||||
rm -f "$destdir/usr/share/glib-2.0/schemas/gschemas.compiled" \
|
|
||||||
"$destdir/usr/share/applications/mimeinfo.cache" \
|
|
||||||
"$destdir/usr/share/icons/hicolor/icon-theme.cache"
|
|
||||||
|
|
||||||
tar --zstd --sort=name --owner=0 --group=0 --numeric-owner --mtime='@0' \
|
|
||||||
-cf "$outfile" -C "$destdir" usr
|
|
||||||
|
|
||||||
rm -rf "$workdir" "$destdir"
|
|
||||||
}
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
pkgbase = bottles-bin
|
|
||||||
pkgdesc = Easily manage wine and proton prefixes (prebuilt)
|
|
||||||
pkgver = 64.1
|
|
||||||
pkgrel = 2
|
|
||||||
url = https://usebottles.com
|
|
||||||
arch = any
|
|
||||||
license = GPL-3.0-only
|
|
||||||
depends = gtk4
|
|
||||||
depends = gtksourceview5
|
|
||||||
depends = hicolor-icon-theme
|
|
||||||
depends = icoextract
|
|
||||||
depends = libadwaita
|
|
||||||
depends = libportal-gtk4
|
|
||||||
depends = python
|
|
||||||
depends = python-cairo
|
|
||||||
depends = python-certifi
|
|
||||||
depends = python-chardet
|
|
||||||
depends = python-charset-normalizer
|
|
||||||
depends = python-gobject
|
|
||||||
depends = python-idna
|
|
||||||
depends = python-markdown
|
|
||||||
depends = python-orjson
|
|
||||||
depends = python-pefile
|
|
||||||
depends = python-pycurl
|
|
||||||
depends = python-requests
|
|
||||||
depends = python-urllib3
|
|
||||||
depends = python-yaml
|
|
||||||
depends = python-yara
|
|
||||||
optdepends = vkbasalt: post-processing layer that applies the configured effects
|
|
||||||
optdepends = vulkan-tools: vkcube test / Vulkan info
|
|
||||||
optdepends = xorg-xdpyinfo: display info detection
|
|
||||||
optdepends = imagemagick: icon/image conversion
|
|
||||||
optdepends = vmtouch: preload bottle files into memory
|
|
||||||
optdepends = mangohud: performance overlay
|
|
||||||
optdepends = gamemode: feral gamemode integration
|
|
||||||
optdepends = gamescope: gamescope session integration
|
|
||||||
optdepends = xterm: fallback terminal for "Run executable in terminal"
|
|
||||||
provides = bottles
|
|
||||||
conflicts = bottles
|
|
||||||
source = bottles-bin-64.1-2.tar.zst::https://github.com/Felitendo/PKGBUILDS/releases/download/bottles-bin-64.1/bottles-bin-64.1.tar.zst
|
|
||||||
sha256sums = 94dd4c5138ef491fed0502e87be2bebde6e7fe9d2881fc66285d12a0451ef0a3
|
|
||||||
|
|
||||||
pkgname = bottles-bin
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
# Maintainer: Felitendo
|
|
||||||
# This PKGBUILD is updated automatically:
|
|
||||||
# https://github.com/Felitendo/PKGBUILDS
|
|
||||||
|
|
||||||
pkgname=bottles-bin
|
|
||||||
pkgver=64.1
|
|
||||||
pkgrel=2
|
|
||||||
pkgdesc="Easily manage wine and proton prefixes (prebuilt)"
|
|
||||||
arch=('any')
|
|
||||||
url="https://usebottles.com"
|
|
||||||
license=('GPL-3.0-only')
|
|
||||||
depends=('gtk4' 'gtksourceview5' 'hicolor-icon-theme' 'icoextract'
|
|
||||||
'libadwaita' 'libportal-gtk4' 'python' 'python-cairo'
|
|
||||||
'python-certifi' 'python-chardet' 'python-charset-normalizer'
|
|
||||||
'python-gobject' 'python-idna' 'python-markdown' 'python-orjson'
|
|
||||||
'python-pefile' 'python-pycurl'
|
|
||||||
'python-requests' 'python-urllib3' 'python-yaml' 'python-yara')
|
|
||||||
optdepends=('vkbasalt: post-processing layer that applies the configured effects'
|
|
||||||
'vulkan-tools: vkcube test / Vulkan info'
|
|
||||||
'xorg-xdpyinfo: display info detection'
|
|
||||||
'imagemagick: icon/image conversion'
|
|
||||||
'vmtouch: preload bottle files into memory'
|
|
||||||
'mangohud: performance overlay'
|
|
||||||
'gamemode: feral gamemode integration'
|
|
||||||
'gamescope: gamescope session integration'
|
|
||||||
'xterm: fallback terminal for "Run executable in terminal"')
|
|
||||||
provides=('bottles')
|
|
||||||
conflicts=('bottles')
|
|
||||||
source=("${pkgname}-${pkgver}-${pkgrel}.tar.zst::https://github.com/Felitendo/PKGBUILDS/releases/download/${pkgname}-${pkgver}/${pkgname}-${pkgver}.tar.zst")
|
|
||||||
sha256sums=('94dd4c5138ef491fed0502e87be2bebde6e7fe9d2881fc66285d12a0451ef0a3')
|
|
||||||
|
|
||||||
package() {
|
|
||||||
cp -a "$srcdir/usr" "$pkgdir/"
|
|
||||||
}
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
# bottles-bin - prebuilt package of https://github.com/bottlesdevs/Bottles
|
|
||||||
# (GTK4 + LibAdwaita wine/proton prefix manager written in Python).
|
|
||||||
#
|
|
||||||
# Upstream only supports Flatpak officially and publishes no usable binary
|
|
||||||
# assets, so build_artifact() builds from the release tarball, carrying the
|
|
||||||
# same de-flatpak patch the AUR source package uses (upstream's meson refuses
|
|
||||||
# to configure outside a Flatpak sandbox and the code hard-requires the
|
|
||||||
# portal).
|
|
||||||
|
|
||||||
UPSTREAM_REPO="bottlesdevs/Bottles"
|
|
||||||
|
|
||||||
# fvs-lab/fvs2 (+ its core library) is AUR-only, so the binary is built here
|
|
||||||
# and bundled under /usr/lib/bottles. Versions pinned to the combination the
|
|
||||||
# AUR fvs2 package ships; bump on new fvs2 releases.
|
|
||||||
FVS2_VERSION=0.8.1
|
|
||||||
FVS2_CORE_VERSION=0.1.1
|
|
||||||
|
|
||||||
# Installed in CI (pacman) before build_artifact runs. blueprint-compiler
|
|
||||||
# resolves Gtk/Adw/GtkSource imports via their typelibs, hence the GUI libs.
|
|
||||||
BUILD_DEPS=(meson ninja blueprint-compiler gobject-introspection
|
|
||||||
desktop-file-utils appstream-glib gettext glib2-devel
|
|
||||||
python python-gobject gtk4 libadwaita gtksourceview5
|
|
||||||
libportal-gtk4 go python-pip)
|
|
||||||
|
|
||||||
latest_version() {
|
|
||||||
gh api "repos/$UPSTREAM_REPO/releases/latest" --jq '.tag_name' | sed 's/^v//'
|
|
||||||
}
|
|
||||||
|
|
||||||
# build_artifact <version> <output-file>
|
|
||||||
build_artifact() {
|
|
||||||
local ver="$1" outfile="$2"
|
|
||||||
local pkgdir workdir destdir srctree
|
|
||||||
pkgdir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
||||||
workdir="$(mktemp -d)"
|
|
||||||
destdir="$(mktemp -d)"
|
|
||||||
|
|
||||||
curl -sfL "https://github.com/$UPSTREAM_REPO/archive/refs/tags/$ver.tar.gz" | tar -xz -C "$workdir"
|
|
||||||
srctree="$workdir/Bottles-$ver"
|
|
||||||
|
|
||||||
patch -d "$srctree" -p1 < "$pkgdir/remove-flatpak-checks.patch"
|
|
||||||
|
|
||||||
# the bundled fvs2 lives outside $PATH; point Bottles at it
|
|
||||||
grep -q 'return "fvs2"' "$srctree/bottles/fvs/repo.py" \
|
|
||||||
|| { echo "fvs2 path hook not found in bottles/fvs/repo.py" >&2; return 1; }
|
|
||||||
sed -i 's|return "fvs2"|return "/usr/lib/bottles/fvs2"|' "$srctree/bottles/fvs/repo.py"
|
|
||||||
|
|
||||||
meson setup "$workdir/build" "$srctree" --prefix=/usr --buildtype=release
|
|
||||||
meson install -C "$workdir/build" --destdir "$destdir"
|
|
||||||
|
|
||||||
# Build the fvs2 CLI (Go) and bundle it. Its "core" library is a sibling
|
|
||||||
# repository that go.mod expects next to the source tree.
|
|
||||||
mkdir -p "$workdir/fvs" "$destdir/usr/lib/bottles"
|
|
||||||
curl -sfL "https://github.com/fvs-lab/fvs2/archive/refs/tags/v$FVS2_VERSION.tar.gz" | tar -xz -C "$workdir/fvs"
|
|
||||||
curl -sfL "https://github.com/fvs-lab/core/archive/refs/tags/v$FVS2_CORE_VERSION.tar.gz" | tar -xz -C "$workdir/fvs"
|
|
||||||
ln -s "core-$FVS2_CORE_VERSION" "$workdir/fvs/core"
|
|
||||||
(cd "$workdir/fvs/fvs2-$FVS2_VERSION" && \
|
|
||||||
GOPATH="$workdir/gopath" \
|
|
||||||
GOFLAGS="-buildmode=pie -trimpath -mod=readonly -modcacherw" \
|
|
||||||
go build -o "$destdir/usr/lib/bottles/fvs2" ./cmd/fvs2)
|
|
||||||
|
|
||||||
# patool, pathvalidate and vkbasalt-cli are AUR-only pure-python libs;
|
|
||||||
# bundle them into the app's module dir, which the launcher puts on
|
|
||||||
# sys.path. patool/pathvalidate pinned via upstream's requirements.txt.
|
|
||||||
grep -E '^(patool|pathvalidate)==' "$srctree/requirements.txt" > "$workdir/bundle-reqs.txt"
|
|
||||||
[[ "$(wc -l < "$workdir/bundle-reqs.txt")" -eq 2 ]] || { echo "expected patool+pathvalidate pins in requirements.txt" >&2; return 1; }
|
|
||||||
echo 'vkbasalt-cli' >> "$workdir/bundle-reqs.txt"
|
|
||||||
python -m pip install --isolated --no-deps --target "$destdir/usr/share/bottles" \
|
|
||||||
-r "$workdir/bundle-reqs.txt"
|
|
||||||
rm -rf "$destdir/usr/share/bottles/bin"
|
|
||||||
|
|
||||||
# These caches are generated by pacman hooks; shipping them would cause
|
|
||||||
# file conflicts on install.
|
|
||||||
rm -f "$destdir/usr/share/glib-2.0/schemas/gschemas.compiled" \
|
|
||||||
"$destdir/usr/share/applications/mimeinfo.cache" \
|
|
||||||
"$destdir/usr/share/icons/hicolor/icon-theme.cache"
|
|
||||||
|
|
||||||
tar --zstd --sort=name --owner=0 --group=0 --numeric-owner --mtime='@0' \
|
|
||||||
-cf "$outfile" -C "$destdir" usr
|
|
||||||
|
|
||||||
rm -rf "$workdir" "$destdir"
|
|
||||||
}
|
|
||||||
@@ -1,172 +0,0 @@
|
|||||||
diff -Naur Bottles-64.1-orig/bottles/frontend/meson.build Bottles-64.1/bottles/frontend/meson.build
|
|
||||||
--- Bottles-64.1-orig/bottles/frontend/meson.build 2026-05-30 13:20:17.000000000 +0200
|
|
||||||
+++ Bottles-64.1/bottles/frontend/meson.build 2026-06-25 20:16:08.858675375 +0200
|
|
||||||
@@ -23,12 +23,6 @@
|
|
||||||
configuration: conf
|
|
||||||
)
|
|
||||||
|
|
||||||
-fs = import('fs')
|
|
||||||
-
|
|
||||||
-if not fs.is_file('/' + '.flatpak-info')
|
|
||||||
- error('file does not exist')
|
|
||||||
-endif
|
|
||||||
-
|
|
||||||
bottles_sources = [
|
|
||||||
'__init__.py',
|
|
||||||
'main.py',
|
|
||||||
diff -Naur Bottles-64.1-orig/bottles/frontend/views/bottle_details.py Bottles-64.1/bottles/frontend/views/bottle_details.py
|
|
||||||
--- Bottles-64.1-orig/bottles/frontend/views/bottle_details.py 2026-05-30 13:20:17.000000000 +0200
|
|
||||||
+++ Bottles-64.1/bottles/frontend/views/bottle_details.py 2026-06-25 20:17:24.688847866 +0200
|
|
||||||
@@ -21,7 +21,7 @@
|
|
||||||
from gettext import gettext as _
|
|
||||||
from typing import Dict, List, Optional
|
|
||||||
|
|
||||||
-from gi.repository import Adw, Gdk, Gio, GLib, Gtk, Xdp
|
|
||||||
+from gi.repository import Adw, Gdk, Gio, GLib, Gtk
|
|
||||||
|
|
||||||
from bottles.backend.managers.backup import BackupManager
|
|
||||||
from bottles.backend.models.config import BottleConfig
|
|
||||||
@@ -692,20 +692,17 @@
|
|
||||||
dialog.connect("response", execute)
|
|
||||||
dialog.show()
|
|
||||||
|
|
||||||
- if Xdp.Portal.running_under_sandbox():
|
|
||||||
- if self.window.settings.get_boolean("show-sandbox-warning"):
|
|
||||||
- dialog = Adw.MessageDialog.new(
|
|
||||||
- self.window,
|
|
||||||
- _("Be Aware of Sandbox"),
|
|
||||||
- _(
|
|
||||||
- "Bottles is running in a sandbox, a restricted permission environment needed to keep you safe. If the program won't run, consider moving inside the bottle (3 dots icon on the top), then launch from there."
|
|
||||||
- ),
|
|
||||||
- )
|
|
||||||
- dialog.add_response("dismiss", _("_Dismiss"))
|
|
||||||
- dialog.connect("response", lambda *args: show_chooser())
|
|
||||||
- dialog.present()
|
|
||||||
- else:
|
|
||||||
- show_chooser()
|
|
||||||
+ if self.window.settings.get_boolean("show-sandbox-warning"):
|
|
||||||
+ dialog = Adw.MessageDialog.new(
|
|
||||||
+ self.window,
|
|
||||||
+ _("Be Aware of Sandbox"),
|
|
||||||
+ _(
|
|
||||||
+ "Bottles is running in a sandbox, a restricted permission environment needed to keep you safe. If the program won't run, consider moving inside the bottle (3 dots icon on the top), then launch from there."
|
|
||||||
+ ),
|
|
||||||
+ )
|
|
||||||
+ dialog.add_response("dismiss", _("_Dismiss"))
|
|
||||||
+ dialog.connect("response", lambda *args: show_chooser())
|
|
||||||
+ dialog.present()
|
|
||||||
else:
|
|
||||||
show_chooser()
|
|
||||||
|
|
||||||
diff -Naur Bottles-64.1-orig/bottles/frontend/views/bottle_preferences.py Bottles-64.1/bottles/frontend/views/bottle_preferences.py
|
|
||||||
--- Bottles-64.1-orig/bottles/frontend/views/bottle_preferences.py 2026-05-30 13:20:17.000000000 +0200
|
|
||||||
+++ Bottles-64.1/bottles/frontend/views/bottle_preferences.py 2026-06-25 20:17:51.920386139 +0200
|
|
||||||
@@ -20,7 +20,7 @@
|
|
||||||
import re
|
|
||||||
from gettext import gettext as _
|
|
||||||
|
|
||||||
-from gi.repository import Adw, Gdk, Gtk, Xdp
|
|
||||||
+from gi.repository import Adw, Gdk, Gtk
|
|
||||||
|
|
||||||
from bottles.backend.globals import (
|
|
||||||
gamemode_available,
|
|
||||||
@@ -141,7 +141,7 @@
|
|
||||||
self.queue = details.queue
|
|
||||||
self.details = details
|
|
||||||
|
|
||||||
- if not gamemode_available or not Xdp.Portal.running_under_sandbox():
|
|
||||||
+ if not gamemode_available:
|
|
||||||
return
|
|
||||||
|
|
||||||
_not_available = _("This feature is unavailable on your system.")
|
|
||||||
diff -Naur Bottles-64.1-orig/bottles/frontend/views/list.py Bottles-64.1/bottles/frontend/views/list.py
|
|
||||||
--- Bottles-64.1-orig/bottles/frontend/views/list.py 2026-05-30 13:20:17.000000000 +0200
|
|
||||||
+++ Bottles-64.1/bottles/frontend/views/list.py 2026-06-25 20:18:08.351774840 +0200
|
|
||||||
@@ -18,7 +18,7 @@
|
|
||||||
from datetime import datetime
|
|
||||||
from gettext import gettext as _, ngettext
|
|
||||||
|
|
||||||
-from gi.repository import Adw, GLib, Gtk, Xdp
|
|
||||||
+from gi.repository import Adw, GLib, Gtk
|
|
||||||
|
|
||||||
from bottles.backend.models.config import BottleConfig
|
|
||||||
from bottles.backend.models.result import Result
|
|
||||||
@@ -83,9 +83,6 @@
|
|
||||||
|
|
||||||
def run_executable(self, *_args):
|
|
||||||
"""Display file dialog for executable"""
|
|
||||||
- if not Xdp.Portal.running_under_sandbox():
|
|
||||||
- return
|
|
||||||
-
|
|
||||||
def set_path(_dialog, response):
|
|
||||||
if response != Gtk.ResponseType.ACCEPT:
|
|
||||||
return
|
|
||||||
diff -Naur Bottles-64.1-orig/bottles/frontend/views/new_bottle_dialog.py Bottles-64.1/bottles/frontend/views/new_bottle_dialog.py
|
|
||||||
--- Bottles-64.1-orig/bottles/frontend/views/new_bottle_dialog.py 2026-05-30 13:20:17.000000000 +0200
|
|
||||||
+++ Bottles-64.1/bottles/frontend/views/new_bottle_dialog.py 2026-06-25 20:18:22.465190406 +0200
|
|
||||||
@@ -20,7 +20,7 @@
|
|
||||||
from threading import Event
|
|
||||||
from typing import Any, Optional
|
|
||||||
|
|
||||||
-from gi.repository import Adw, Gio, GLib, GObject, Gtk, Pango, Xdp
|
|
||||||
+from gi.repository import Adw, Gio, GLib, GObject, Gtk, Pango
|
|
||||||
from pathvalidate import sanitize_filename
|
|
||||||
|
|
||||||
from bottles.backend.models.config import BottleConfig
|
|
||||||
@@ -86,7 +86,7 @@
|
|
||||||
super().__init__(**kwargs)
|
|
||||||
# common variables and references
|
|
||||||
self.window = GtkUtils.get_parent_window()
|
|
||||||
- if not self.window or not Xdp.Portal.running_under_sandbox():
|
|
||||||
+ if not self.window:
|
|
||||||
return
|
|
||||||
|
|
||||||
self.app = self.window.get_application()
|
|
||||||
diff -Naur Bottles-64.1-orig/bottles/frontend/windows/window.py Bottles-64.1/bottles/frontend/windows/window.py
|
|
||||||
--- Bottles-64.1-orig/bottles/frontend/windows/window.py 2026-05-30 13:20:17.000000000 +0200
|
|
||||||
+++ Bottles-64.1/bottles/frontend/windows/window.py 2026-06-25 20:18:50.936202160 +0200
|
|
||||||
@@ -22,7 +22,7 @@
|
|
||||||
from gettext import gettext as _
|
|
||||||
from typing import Optional
|
|
||||||
|
|
||||||
-from gi.repository import Adw, Gdk, Gio, GLib, GObject, Gtk, Xdp
|
|
||||||
+from gi.repository import Adw, Gdk, Gio, GLib, GObject, Gtk
|
|
||||||
|
|
||||||
from bottles.backend.globals import Paths
|
|
||||||
from bottles.backend.health import HealthChecker
|
|
||||||
@@ -125,35 +125,6 @@
|
|
||||||
manager = Adw.StyleManager.get_default()
|
|
||||||
manager.set_color_scheme(Adw.ColorScheme.FORCE_DARK)
|
|
||||||
|
|
||||||
- # Be VERY explicit that non-sandboxed environments are unsupported
|
|
||||||
- if not Xdp.Portal.running_under_sandbox():
|
|
||||||
-
|
|
||||||
- def response(dialog, response, *args):
|
|
||||||
- if response == "close":
|
|
||||||
- quit(1)
|
|
||||||
-
|
|
||||||
- body = _(
|
|
||||||
- "Bottles is only supported within a sandboxed environment. Official sources of Bottles are available at"
|
|
||||||
- )
|
|
||||||
- download_url = "usebottles.com/download"
|
|
||||||
-
|
|
||||||
- error_dialog = Adw.AlertDialog.new(
|
|
||||||
- _("Unsupported Environment"),
|
|
||||||
- f"{body} <a href='https://{download_url}' title='https://{download_url}'>{download_url}.</a>",
|
|
||||||
- )
|
|
||||||
-
|
|
||||||
- error_dialog.add_response("close", _("Close"))
|
|
||||||
- error_dialog.set_body_use_markup(True)
|
|
||||||
- error_dialog.connect("response", response)
|
|
||||||
- error_dialog.present(self)
|
|
||||||
- logging.error(
|
|
||||||
- _(
|
|
||||||
- "Bottles is only supported within a sandboxed format. Official sources of Bottles are available at:"
|
|
||||||
- )
|
|
||||||
- )
|
|
||||||
- logging.error("https://usebottles.com/download/")
|
|
||||||
- return
|
|
||||||
-
|
|
||||||
# Loading view
|
|
||||||
self.page_loading = LoadingView()
|
|
||||||
|
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
pkgbase = bottles-opener
|
||||||
|
pkgdesc = Double-click a file and it opens in its Windows program, inside its Bottles bottle
|
||||||
|
pkgver = 0.1.1
|
||||||
|
pkgrel = 1
|
||||||
|
url = https://git.felo.gg/LoonixTools/bottles-opener
|
||||||
|
install = bottles-opener.install
|
||||||
|
arch = any
|
||||||
|
license = GPL-3.0-or-later
|
||||||
|
makedepends = gettext
|
||||||
|
makedepends = scdoc
|
||||||
|
depends = bash
|
||||||
|
depends = coreutils
|
||||||
|
depends = gawk
|
||||||
|
depends = grep
|
||||||
|
depends = sed
|
||||||
|
depends = gettext
|
||||||
|
depends = shared-mime-info
|
||||||
|
depends = systemd
|
||||||
|
optdepends = bottles: Bottles itself (the Flatpak works too)
|
||||||
|
optdepends = python-yaml: read bottles without starting the Bottles Flatpak
|
||||||
|
optdepends = icoextract: extract file icons without starting the Bottles Flatpak
|
||||||
|
optdepends = libnotify: report files that could not be opened
|
||||||
|
optdepends = desktop-file-utils: refresh the desktop database after a change
|
||||||
|
optdepends = flatpak: open files with the Bottles Flatpak
|
||||||
|
source = bottles-opener-0.1.1.tar.gz::https://git.felo.gg/LoonixTools/bottles-opener/archive/v0.1.1.tar.gz
|
||||||
|
sha256sums = 3ec601cd59006e72d3b4c1d20b8967aad77b7baf20525d8ff53a7ae4f4822bd9
|
||||||
|
|
||||||
|
pkgname = bottles-opener
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
# Maintainer: Felitendo
|
||||||
|
# This PKGBUILD is updated automatically:
|
||||||
|
# https://git.felo.gg/Felitendo/PKGBUILDS
|
||||||
|
|
||||||
|
pkgname=bottles-opener
|
||||||
|
pkgver=0.1.1
|
||||||
|
pkgrel=1
|
||||||
|
pkgdesc="Double-click a file and it opens in its Windows program, inside its Bottles bottle"
|
||||||
|
arch=('any')
|
||||||
|
url="https://git.felo.gg/LoonixTools/bottles-opener"
|
||||||
|
license=('GPL-3.0-or-later')
|
||||||
|
depends=('bash' 'coreutils' 'gawk' 'grep' 'sed' 'gettext' 'shared-mime-info' 'systemd')
|
||||||
|
makedepends=('gettext' 'scdoc')
|
||||||
|
optdepends=('bottles: Bottles itself (the Flatpak works too)'
|
||||||
|
'python-yaml: read bottles without starting the Bottles Flatpak'
|
||||||
|
'icoextract: extract file icons without starting the Bottles Flatpak'
|
||||||
|
'libnotify: report files that could not be opened'
|
||||||
|
'desktop-file-utils: refresh the desktop database after a change'
|
||||||
|
'flatpak: open files with the Bottles Flatpak')
|
||||||
|
install="${pkgname}.install"
|
||||||
|
source=("${pkgname}-${pkgver}.tar.gz::${url}/archive/v${pkgver}.tar.gz")
|
||||||
|
sha256sums=('3ec601cd59006e72d3b4c1d20b8967aad77b7baf20525d8ff53a7ae4f4822bd9')
|
||||||
|
|
||||||
|
build() {
|
||||||
|
# pass the version being packaged so `bottles-opener --version` cannot drift
|
||||||
|
# away from pkgver
|
||||||
|
make -C "${pkgname}" VERSION="$pkgver"
|
||||||
|
}
|
||||||
|
|
||||||
|
package() {
|
||||||
|
make -C "${pkgname}" VERSION="$pkgver" DESTDIR="$pkgdir" install
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
post_install() {
|
||||||
|
cat <<'MSG'
|
||||||
|
|
||||||
|
bottles-opener is installed but not active yet.
|
||||||
|
|
||||||
|
bottles-opener interactive menu
|
||||||
|
bottles-opener enable set up file opening for your bottles
|
||||||
|
|
||||||
|
Run it as your own user, not with sudo: it only ever writes inside your own
|
||||||
|
home directory.
|
||||||
|
|
||||||
|
MSG
|
||||||
|
}
|
||||||
|
|
||||||
|
pre_remove() {
|
||||||
|
# The changes live in each user's home and cannot be undone from a root-run
|
||||||
|
# hook, so say so while the command that does it still exists.
|
||||||
|
cat <<'MSG'
|
||||||
|
|
||||||
|
Before removing this package, run
|
||||||
|
|
||||||
|
bottles-opener disable
|
||||||
|
|
||||||
|
as each user that enabled it. That removes the file types, launchers and
|
||||||
|
icons it added and puts back the previous default applications.
|
||||||
|
|
||||||
|
MSG
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
# bottles-opener - opens files in their Windows program inside Bottles
|
||||||
|
# (https://git.felo.gg/LoonixTools/bottles-opener).
|
||||||
|
#
|
||||||
|
# Shell and two small Python scripts, a gettext catalog and a scdoc man page:
|
||||||
|
# the PKGBUILD runs the upstream Makefile against the release tarball.
|
||||||
|
|
||||||
|
UPSTREAM_REPO="LoonixTools/bottles-opener"
|
||||||
|
|
||||||
|
# Installed in CI (pacman) before the makepkg test build.
|
||||||
|
BUILD_DEPS=(gettext scdoc)
|
||||||
|
|
||||||
|
latest_version() {
|
||||||
|
# the highest vX.Y.Z tag; not every release has a release page
|
||||||
|
curl -sf "https://git.felo.gg/api/v1/repos/$UPSTREAM_REPO/tags?limit=50" \
|
||||||
|
| jq -r '.[].name | select(test("^v[0-9]+(\\.[0-9]+)*$"))' \
|
||||||
|
| sed 's/^v//' | sort -V | tail -n 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# refresh_checksums <version> <pkgbuild-path>
|
||||||
|
refresh_checksums() {
|
||||||
|
local ver="$1" pkgbuild="$2"
|
||||||
|
local sha
|
||||||
|
|
||||||
|
sha="$(curl -sfL "https://git.felo.gg/$UPSTREAM_REPO/archive/v$ver.tar.gz" \
|
||||||
|
| sha256sum | cut -d' ' -f1)"
|
||||||
|
|
||||||
|
sed -i "s|^sha256sums=.*|sha256sums=('$sha')|" "$pkgbuild"
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
pkgbase = bt-volume-step
|
||||||
|
pkgdesc = Fixed volume steps for Bluetooth audio devices on PipeWire
|
||||||
|
pkgver = 1.0.0
|
||||||
|
pkgrel = 1
|
||||||
|
url = https://git.felo.gg/LoonixTools/bt-volume-step
|
||||||
|
install = bt-volume-step.install
|
||||||
|
arch = any
|
||||||
|
license = BSD-3-Clause
|
||||||
|
depends = python
|
||||||
|
depends = libpulse
|
||||||
|
optdepends = kconfig: follow the KDE Plasma volume step setting
|
||||||
|
optdepends = bluez-utils: device names in --show
|
||||||
|
source = bt-volume-step-1.0.0.tar.gz::https://git.felo.gg/LoonixTools/bt-volume-step/archive/v1.0.0.tar.gz
|
||||||
|
sha256sums = 32373fd4440dcd7bd19988f78675f9cf400ec7ebe51a828bbd9468ee0c5a18dc
|
||||||
|
|
||||||
|
pkgname = bt-volume-step
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
# Maintainer: Felitendo
|
||||||
|
# This PKGBUILD is updated automatically:
|
||||||
|
# https://git.felo.gg/Felitendo/PKGBUILDS
|
||||||
|
|
||||||
|
pkgname=bt-volume-step
|
||||||
|
pkgver=1.0.0
|
||||||
|
pkgrel=1
|
||||||
|
pkgdesc="Fixed volume steps for Bluetooth audio devices on PipeWire"
|
||||||
|
arch=('any')
|
||||||
|
url="https://git.felo.gg/LoonixTools/bt-volume-step"
|
||||||
|
license=('BSD-3-Clause')
|
||||||
|
depends=('python' 'libpulse')
|
||||||
|
optdepends=('kconfig: follow the KDE Plasma volume step setting'
|
||||||
|
'bluez-utils: device names in --show')
|
||||||
|
# Arch packages never enable units themselves (the default preset is
|
||||||
|
# "disable *"), and a user unit could not be enabled from a pacman transaction
|
||||||
|
# anyway - it runs as root, without the user's session bus. Print the command
|
||||||
|
# instead.
|
||||||
|
install="${pkgname}.install"
|
||||||
|
source=("${pkgname}-${pkgver}.tar.gz::${url}/archive/v${pkgver}.tar.gz")
|
||||||
|
sha256sums=('32373fd4440dcd7bd19988f78675f9cf400ec7ebe51a828bbd9468ee0c5a18dc')
|
||||||
|
|
||||||
|
check() {
|
||||||
|
cd "${pkgname}"
|
||||||
|
make check
|
||||||
|
}
|
||||||
|
|
||||||
|
package() {
|
||||||
|
cd "${pkgname}"
|
||||||
|
make install PREFIX=/usr DESTDIR="$pkgdir"
|
||||||
|
install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
|
||||||
|
install -Dm644 README.md -t "$pkgdir/usr/share/doc/$pkgname"
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
post_install() {
|
||||||
|
cat <<'EOF'
|
||||||
|
==> bt-volume-step ships a systemd user unit. Enable it for your session:
|
||||||
|
==>
|
||||||
|
==> systemctl --user enable --now bt-volume-step
|
||||||
|
==>
|
||||||
|
==> Then use the volume control on a connected Bluetooth device a few times:
|
||||||
|
==> the daemon measures that device's volume grid before it starts correcting.
|
||||||
|
EOF
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
# bt-volume-step - fixed volume steps for Bluetooth audio devices on PipeWire
|
||||||
|
# (https://git.felo.gg/LoonixTools/bt-volume-step).
|
||||||
|
#
|
||||||
|
# Nothing is compiled: the payload is a single Python script plus a systemd
|
||||||
|
# user unit, installed by the upstream Makefile. Sourced from the release
|
||||||
|
# tarball, so this is a source package without a -bin suffix.
|
||||||
|
|
||||||
|
UPSTREAM_REPO="LoonixTools/bt-volume-step"
|
||||||
|
|
||||||
|
# Installed in CI (pacman) before the makepkg test build. check() runs the
|
||||||
|
# upstream test suite, which needs nothing beyond python.
|
||||||
|
BUILD_DEPS=(python)
|
||||||
|
|
||||||
|
latest_version() {
|
||||||
|
# the highest vX.Y.Z tag; not every release has a release page
|
||||||
|
curl -sf "https://git.felo.gg/api/v1/repos/$UPSTREAM_REPO/tags?limit=50" \
|
||||||
|
| jq -r '.[].name | select(test("^v[0-9]+(\\.[0-9]+)*$"))' \
|
||||||
|
| sed 's/^v//' | sort -V | tail -n 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# refresh_checksums <version> <pkgbuild-path>
|
||||||
|
refresh_checksums() {
|
||||||
|
local ver="$1" pkgbuild="$2"
|
||||||
|
local sha
|
||||||
|
sha="$(curl -sfL \
|
||||||
|
"https://git.felo.gg/$UPSTREAM_REPO/archive/v$ver.tar.gz" \
|
||||||
|
| sha256sum | cut -d' ' -f1)"
|
||||||
|
sed -i "s|^sha256sums=.*|sha256sums=('$sha')|" "$pkgbuild"
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
pkgbase = cachy-auto-update
|
||||||
|
pkgdesc = Unattended background updates for CachyOS, aware of battery, gaming and manual package management
|
||||||
|
pkgver = 1.3.2
|
||||||
|
pkgrel = 1
|
||||||
|
url = https://git.felo.gg/LoonixTools/cachy-auto-update
|
||||||
|
install = cachy-auto-update.install
|
||||||
|
arch = any
|
||||||
|
license = GPL-3.0-or-later
|
||||||
|
makedepends = gettext
|
||||||
|
makedepends = scdoc
|
||||||
|
depends = bash
|
||||||
|
depends = systemd
|
||||||
|
depends = pacman
|
||||||
|
depends = pacman-contrib
|
||||||
|
depends = util-linux
|
||||||
|
depends = sudo
|
||||||
|
depends = gettext
|
||||||
|
optdepends = paru: AUR package updates
|
||||||
|
optdepends = yay: AUR package updates
|
||||||
|
optdepends = base-devel: required to build AUR packages
|
||||||
|
optdepends = flatpak: Flatpak updates
|
||||||
|
optdepends = libnotify: desktop notifications
|
||||||
|
optdepends = gearlever: AppImage updates
|
||||||
|
optdepends = python-gobject: progress bar in the desktop taskbar
|
||||||
|
backup = etc/cachy-auto-update/cachy-auto-update.conf
|
||||||
|
backup = etc/logrotate.d/cachy-auto-update
|
||||||
|
source = cachy-auto-update-1.3.2.tar.gz::https://git.felo.gg/LoonixTools/cachy-auto-update/archive/v1.3.2.tar.gz
|
||||||
|
sha256sums = 0f680d222852a72197d1b6a3cad9d093d1c06257c55d9f58144b0403dc42adec
|
||||||
|
|
||||||
|
pkgname = cachy-auto-update
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
# Maintainer: Felitendo
|
||||||
|
# This PKGBUILD is updated automatically:
|
||||||
|
# https://git.felo.gg/Felitendo/PKGBUILDS
|
||||||
|
|
||||||
|
pkgname=cachy-auto-update
|
||||||
|
pkgver=1.3.2
|
||||||
|
pkgrel=1
|
||||||
|
pkgdesc="Unattended background updates for CachyOS, aware of battery, gaming and manual package management"
|
||||||
|
arch=('any')
|
||||||
|
url="https://git.felo.gg/LoonixTools/cachy-auto-update"
|
||||||
|
license=('GPL-3.0-or-later')
|
||||||
|
depends=('bash' 'systemd' 'pacman' 'pacman-contrib' 'util-linux' 'sudo'
|
||||||
|
'gettext')
|
||||||
|
makedepends=('gettext' 'scdoc')
|
||||||
|
optdepends=('paru: AUR package updates'
|
||||||
|
'yay: AUR package updates'
|
||||||
|
'base-devel: required to build AUR packages'
|
||||||
|
'flatpak: Flatpak updates'
|
||||||
|
'libnotify: desktop notifications'
|
||||||
|
'gearlever: AppImage updates'
|
||||||
|
'python-gobject: progress bar in the desktop taskbar')
|
||||||
|
backup=('etc/cachy-auto-update/cachy-auto-update.conf'
|
||||||
|
'etc/logrotate.d/cachy-auto-update')
|
||||||
|
install="${pkgname}.install"
|
||||||
|
source=("${pkgname}-${pkgver}.tar.gz::${url}/archive/v${pkgver}.tar.gz")
|
||||||
|
sha256sums=('0f680d222852a72197d1b6a3cad9d093d1c06257c55d9f58144b0403dc42adec')
|
||||||
|
|
||||||
|
build() {
|
||||||
|
# pass the version being packaged so `cachy-auto-update --version` cannot
|
||||||
|
# drift away from pkgver
|
||||||
|
make -C "${pkgname}" VERSION="$pkgver"
|
||||||
|
}
|
||||||
|
|
||||||
|
package() {
|
||||||
|
make -C "${pkgname}" VERSION="$pkgver" DESTDIR="$pkgdir" install
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
_check_sudoers() {
|
||||||
|
# A malformed drop-in in /etc/sudoers.d takes sudo down for the whole
|
||||||
|
# machine, so say so loudly rather than leaving it to be discovered later.
|
||||||
|
if command -v visudo > /dev/null 2>&1; then
|
||||||
|
if ! visudo -cf /etc/sudoers.d/cachy-auto-update > /dev/null 2>&1; then
|
||||||
|
printf '\n WARNING: /etc/sudoers.d/cachy-auto-update did not validate.\n' >&2
|
||||||
|
printf ' AUR updates will not work until this is resolved.\n\n' >&2
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
post_install() {
|
||||||
|
_check_sudoers
|
||||||
|
|
||||||
|
cat <<'EOF'
|
||||||
|
|
||||||
|
cachy-auto-update is installed but not active yet.
|
||||||
|
|
||||||
|
sudo cachy-auto-update interactive setup
|
||||||
|
sudo cachy-auto-update enable turn automatic updates on
|
||||||
|
sudo cachy-auto-update status see what it would do right now
|
||||||
|
|
||||||
|
AUR packages are built by a locked system account that is allowed to call
|
||||||
|
pacman without a password (/etc/sudoers.d/cachy-auto-update). No user
|
||||||
|
password is stored anywhere. Set UpdateAUR=no in
|
||||||
|
/etc/cachy-auto-update/cachy-auto-update.conf to opt out of that entirely.
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
post_upgrade() {
|
||||||
|
_check_sudoers
|
||||||
|
}
|
||||||
|
|
||||||
|
pre_remove() {
|
||||||
|
systemctl disable --now cachy-auto-update.timer > /dev/null 2>&1 || true
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
# cachy-auto-update - unattended background updates for CachyOS
|
||||||
|
# (https://git.felo.gg/LoonixTools/cachy-auto-update).
|
||||||
|
#
|
||||||
|
# Pure shell plus a gettext catalog and a scdoc man page, so the PKGBUILD just
|
||||||
|
# runs the upstream Makefile against the release tarball. Nothing is prebuilt
|
||||||
|
# and nothing is republished - the AUR package builds exactly what the tag
|
||||||
|
# contains.
|
||||||
|
|
||||||
|
UPSTREAM_REPO="LoonixTools/cachy-auto-update"
|
||||||
|
|
||||||
|
# Installed in CI (pacman) before the makepkg test build.
|
||||||
|
BUILD_DEPS=(gettext scdoc)
|
||||||
|
|
||||||
|
latest_version() {
|
||||||
|
# the highest vX.Y.Z tag; not every release has a release page
|
||||||
|
curl -sf "https://git.felo.gg/api/v1/repos/$UPSTREAM_REPO/tags?limit=50" \
|
||||||
|
| jq -r '.[].name | select(test("^v[0-9]+(\\.[0-9]+)*$"))' \
|
||||||
|
| sed 's/^v//' | sort -V | tail -n 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# refresh_checksums <version> <pkgbuild-path>
|
||||||
|
refresh_checksums() {
|
||||||
|
local ver="$1" pkgbuild="$2"
|
||||||
|
local sha
|
||||||
|
|
||||||
|
sha="$(curl -sfL "https://git.felo.gg/$UPSTREAM_REPO/archive/v$ver.tar.gz" \
|
||||||
|
| sha256sum | cut -d' ' -f1)"
|
||||||
|
|
||||||
|
sed -i "s|^sha256sums=.*|sha256sums=('$sha')|" "$pkgbuild"
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
pkgbase = capture-studio-bin
|
||||||
|
pkgdesc = Record and edit product demos: cut pauses, add zooms and captions (upstream Flatpak bundle)
|
||||||
|
pkgver = 0.1.32
|
||||||
|
pkgrel = 1
|
||||||
|
url = https://tenzen.studio
|
||||||
|
arch = x86_64
|
||||||
|
license = LicenseRef-proprietary
|
||||||
|
makedepends = ostree
|
||||||
|
makedepends = asar
|
||||||
|
depends = gtk3
|
||||||
|
depends = nss
|
||||||
|
depends = alsa-lib
|
||||||
|
depends = ffmpeg
|
||||||
|
depends = python-xlib
|
||||||
|
optdepends = libpulse: record system audio
|
||||||
|
provides = capture-studio
|
||||||
|
conflicts = capture-studio
|
||||||
|
conflicts = tenzen-studio-bin
|
||||||
|
noextract = Capture-Studio-0.1.32-linux-x64.flatpak
|
||||||
|
options = !strip
|
||||||
|
options = !debug
|
||||||
|
source = Capture-Studio-0.1.32-linux-x64.flatpak::https://downloads.tenzen.studio/desktop/stable/linux/0.1.32/Capture-Studio-0.1.32-linux-x64.flatpak
|
||||||
|
sha256sums = 80958f46ebcec4197ca77e759f98ca7e6f496205070be57c487c1fa463624e3b
|
||||||
|
|
||||||
|
pkgname = capture-studio-bin
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
# Maintainer: Felitendo
|
||||||
|
# This PKGBUILD is updated automatically:
|
||||||
|
# https://git.felo.gg/Felitendo/PKGBUILDS
|
||||||
|
|
||||||
|
pkgname=capture-studio-bin
|
||||||
|
_pkgname=tenzen
|
||||||
|
pkgver=0.1.32
|
||||||
|
pkgrel=1
|
||||||
|
pkgdesc="Record and edit product demos: cut pauses, add zooms and captions (upstream Flatpak bundle)"
|
||||||
|
arch=('x86_64')
|
||||||
|
url="https://tenzen.studio"
|
||||||
|
license=('LicenseRef-proprietary')
|
||||||
|
depends=('gtk3' 'nss' 'alsa-lib' 'ffmpeg' 'python-xlib')
|
||||||
|
optdepends=('libpulse: record system audio')
|
||||||
|
makedepends=('ostree' 'asar')
|
||||||
|
provides=('capture-studio')
|
||||||
|
# called tenzen-studio-bin on the AUR before
|
||||||
|
conflicts=('capture-studio' 'tenzen-studio-bin')
|
||||||
|
options=('!strip' '!debug')
|
||||||
|
_bundle="Capture-Studio-${pkgver}-linux-x64.flatpak"
|
||||||
|
source=("${_bundle}::https://downloads.tenzen.studio/desktop/stable/linux/${pkgver}/${_bundle}")
|
||||||
|
noextract=("${_bundle}")
|
||||||
|
sha256sums=('80958f46ebcec4197ca77e759f98ca7e6f496205070be57c487c1fa463624e3b')
|
||||||
|
|
||||||
|
prepare() {
|
||||||
|
# A Flatpak bundle is an OSTree static delta carrying a single commit:
|
||||||
|
# apply it to a throwaway repository and check that commit out.
|
||||||
|
rm -rf repo flatpak
|
||||||
|
ostree init --repo=repo --mode=bare-user-only
|
||||||
|
ostree static-delta apply-offline --repo=repo "${_bundle}"
|
||||||
|
|
||||||
|
local _commit
|
||||||
|
_commit="$(find repo/objects -name '*.commit')"
|
||||||
|
_commit="$(basename "$(dirname "${_commit}")")$(basename "${_commit}" .commit)"
|
||||||
|
ostree checkout --repo=repo --user-mode "${_commit}" flatpak
|
||||||
|
|
||||||
|
# the bundle exports no icon - the app's own is only inside app.asar
|
||||||
|
asar extract-file flatpak/files/lib/com.tenzen.desktop/resources/app.asar \
|
||||||
|
dist/assets/brand/icon.png
|
||||||
|
}
|
||||||
|
|
||||||
|
package() {
|
||||||
|
install -d "${pkgdir}/opt/${pkgname}"
|
||||||
|
cp -a "${srcdir}/flatpak/files/lib/com.tenzen.desktop/." "${pkgdir}/opt/${pkgname}/"
|
||||||
|
|
||||||
|
install -d "${pkgdir}/usr/bin"
|
||||||
|
ln -s "/opt/${pkgname}/${_pkgname}" "${pkgdir}/usr/bin/${_pkgname}"
|
||||||
|
|
||||||
|
# named after the app's desktopName, so windows are matched to the entry
|
||||||
|
install -Dm644 "${srcdir}/flatpak/files/share/applications/com.tenzen.desktop.desktop" \
|
||||||
|
"${pkgdir}/usr/share/applications/${_pkgname}.desktop"
|
||||||
|
sed -i \
|
||||||
|
-e "s|^Exec=.*|Exec=${_pkgname} %U|" \
|
||||||
|
-e "s|^Icon=.*|Icon=${_pkgname}|" \
|
||||||
|
"${pkgdir}/usr/share/applications/${_pkgname}.desktop"
|
||||||
|
|
||||||
|
# 1024x1024, which the hicolor theme has no directory for
|
||||||
|
install -Dm644 "${srcdir}/icon.png" "${pkgdir}/usr/share/pixmaps/${_pkgname}.png"
|
||||||
|
|
||||||
|
# A custom licence has to ship its terms. Upstream publishes none as a file,
|
||||||
|
# so what goes in is the reference to the terms it is used under, next to
|
||||||
|
# the notices for everything bundled with it, which the app dir does carry.
|
||||||
|
install -Dm644 /dev/stdin "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE" <<'EOF'
|
||||||
|
Capture Studio is proprietary software, distributed by Tenzen Studio.
|
||||||
|
|
||||||
|
It is not covered by a free-software licence: use is governed by the terms
|
||||||
|
of service the vendor publishes, and redistribution of the build this
|
||||||
|
package installs is not granted by them.
|
||||||
|
|
||||||
|
Terms of service: https://tenzen.studio/legal/terms-of-service/
|
||||||
|
EOF
|
||||||
|
|
||||||
|
ln -s "/opt/${pkgname}/resources/THIRD_PARTY_NOTICES.txt" \
|
||||||
|
"${pkgdir}/usr/share/licenses/${pkgname}/THIRD_PARTY_NOTICES.txt"
|
||||||
|
ln -s "/opt/${pkgname}/LICENSE.electron.txt" \
|
||||||
|
"${pkgdir}/usr/share/licenses/${pkgname}/LICENSE.electron.txt"
|
||||||
|
ln -s "/opt/${pkgname}/LICENSES.chromium.html" \
|
||||||
|
"${pkgdir}/usr/share/licenses/${pkgname}/LICENSES.chromium.html"
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
# capture-studio-bin - Capture Studio by Tenzen Studio (https://tenzen.studio),
|
||||||
|
# a proprietary Electron app for recording and editing product demos.
|
||||||
|
#
|
||||||
|
# Upstream publishes no source, so there is only this -bin package. For Linux
|
||||||
|
# it ships nothing but a Flatpak bundle, versioned on its own download host:
|
||||||
|
# the PKGBUILD unpacks that with ostree (a Flatpak bundle is an OSTree static
|
||||||
|
# delta) and takes the icon out of app.asar, so the test build needs both.
|
||||||
|
#
|
||||||
|
# The release API names the current version and lists every artifact with its
|
||||||
|
# sha256, so nothing has to be downloaded to refresh the checksum - makepkg's
|
||||||
|
# test build verifies it against the real download anyway.
|
||||||
|
|
||||||
|
API="https://tenzen.studio/api/v1/desktop/releases/latest?channel=stable"
|
||||||
|
|
||||||
|
BUILD_DEPS=(ostree asar)
|
||||||
|
|
||||||
|
latest_version() {
|
||||||
|
curl -sf "$API" | jq -r '.release.version'
|
||||||
|
}
|
||||||
|
|
||||||
|
# refresh_checksums <version> <pkgbuild-path>
|
||||||
|
refresh_checksums() {
|
||||||
|
local ver="$1" pkgbuild="$2" sha
|
||||||
|
|
||||||
|
sha="$(curl -sf "$API" | jq -r --arg f "Capture-Studio-$ver-linux-x64.flatpak" \
|
||||||
|
'.release.artifacts[] | select(.file_name == $f) | .sha256')"
|
||||||
|
if [[ ! "$sha" =~ ^[0-9a-f]{64}$ ]]; then
|
||||||
|
echo "the release API lists no Capture-Studio-$ver-linux-x64.flatpak" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
sed -i "s|^sha256sums=.*|sha256sums=('$sha')|" "$pkgbuild"
|
||||||
|
}
|
||||||
+26
-24
@@ -1,32 +1,29 @@
|
|||||||
pkgbase = chiaki-ng-bin
|
pkgbase = chiaki-ng-bin
|
||||||
pkgdesc = Free and Open Source PlayStation Remote Play client (prebuilt)
|
pkgdesc = Free and Open Source PlayStation Remote Play client (upstream AppImage)
|
||||||
pkgver = 1.10.0
|
pkgver = 1.10.0
|
||||||
pkgrel = 1
|
pkgrel = 2
|
||||||
url = https://streetpea.github.io/chiaki-ng/
|
url = https://streetpea.github.io/chiaki-ng/
|
||||||
arch = x86_64
|
arch = x86_64
|
||||||
license = LicenseRef-AGPL-3.0-only-OpenSSL
|
license = LicenseRef-AGPL-3.0-only-OpenSSL
|
||||||
depends = curl
|
|
||||||
depends = ffmpeg
|
|
||||||
depends = fftw
|
|
||||||
depends = gcc-libs
|
|
||||||
depends = glibc
|
depends = glibc
|
||||||
depends = hicolor-icon-theme
|
depends = gcc-libs
|
||||||
depends = hidapi
|
|
||||||
depends = json-c
|
|
||||||
depends = libidn2
|
|
||||||
depends = libplacebo
|
|
||||||
depends = libpsl
|
|
||||||
depends = libssh2
|
|
||||||
depends = miniupnpc
|
|
||||||
depends = openssl
|
|
||||||
depends = opus
|
|
||||||
depends = qt6-base
|
|
||||||
depends = qt6-declarative
|
|
||||||
depends = qt6-svg
|
|
||||||
depends = qt6-webengine
|
|
||||||
depends = sdl2
|
|
||||||
depends = speexdsp
|
|
||||||
depends = zlib
|
depends = zlib
|
||||||
|
depends = bzip2
|
||||||
|
depends = brotli
|
||||||
|
depends = expat
|
||||||
|
depends = libgpg-error
|
||||||
|
depends = e2fsprogs
|
||||||
|
depends = fontconfig
|
||||||
|
depends = freetype2
|
||||||
|
depends = alsa-lib
|
||||||
|
depends = libx11
|
||||||
|
depends = libxcb
|
||||||
|
depends = libdrm
|
||||||
|
depends = libva
|
||||||
|
depends = libglvnd
|
||||||
|
depends = mesa
|
||||||
|
depends = vulkan-icd-loader
|
||||||
|
depends = hicolor-icon-theme
|
||||||
optdepends = intel-media-driver: vaapi backend for Intel GPUs [>= Broadwell]
|
optdepends = intel-media-driver: vaapi backend for Intel GPUs [>= Broadwell]
|
||||||
optdepends = libva-intel-driver: vaapi backend for Intel GPUs [<= Haswell]
|
optdepends = libva-intel-driver: vaapi backend for Intel GPUs [<= Haswell]
|
||||||
optdepends = libva-mesa-driver: vaapi backend for AMD GPUs
|
optdepends = libva-mesa-driver: vaapi backend for AMD GPUs
|
||||||
@@ -34,7 +31,12 @@ pkgbase = chiaki-ng-bin
|
|||||||
provides = chiaki
|
provides = chiaki
|
||||||
conflicts = chiaki-ng
|
conflicts = chiaki-ng
|
||||||
conflicts = chiaki
|
conflicts = chiaki
|
||||||
source = chiaki-ng-bin-1.10.0-1.tar.zst::https://github.com/Felitendo/PKGBUILDS/releases/download/chiaki-ng-bin-1.10.0/chiaki-ng-bin-1.10.0.tar.zst
|
noextract = chiaki-ng-bin-1.10.0.AppImage
|
||||||
sha256sums = 76c55be0342c651a65ffe5df5ed14930d43b844590cac9f4ea67d23e80557599
|
options = !strip
|
||||||
|
options = !debug
|
||||||
|
source = chiaki-ng-bin-1.10.0.AppImage::https://github.com/streetpea/chiaki-ng/releases/download/v1.10.0/chiaki-ng.AppImage_x86_64
|
||||||
|
source = COPYING-1.10.0::https://raw.githubusercontent.com/streetpea/chiaki-ng/v1.10.0/COPYING
|
||||||
|
sha256sums = cac42c21a19a111f2f0729bb9eef7d3878c6d2a4f06e017d383aff2aba719fd3
|
||||||
|
sha256sums = fff3acb5eddbde97746cc1ad2082a1e95f50c2315a8748b26b8a81a499d8d216
|
||||||
|
|
||||||
pkgname = chiaki-ng-bin
|
pkgname = chiaki-ng-bin
|
||||||
+48
-10
@@ -1,26 +1,64 @@
|
|||||||
# Maintainer: Felitendo
|
# Maintainer: Felitendo
|
||||||
# This PKGBUILD is updated automatically:
|
# This PKGBUILD is updated automatically:
|
||||||
# https://github.com/Felitendo/PKGBUILDS
|
# https://git.felo.gg/Felitendo/PKGBUILDS
|
||||||
|
|
||||||
pkgname=chiaki-ng-bin
|
pkgname=chiaki-ng-bin
|
||||||
pkgver=1.10.0
|
pkgver=1.10.0
|
||||||
pkgrel=1
|
pkgrel=2
|
||||||
pkgdesc="Free and Open Source PlayStation Remote Play client (prebuilt)"
|
pkgdesc="Free and Open Source PlayStation Remote Play client (upstream AppImage)"
|
||||||
arch=('x86_64')
|
arch=('x86_64')
|
||||||
url="https://streetpea.github.io/chiaki-ng/"
|
url="https://streetpea.github.io/chiaki-ng/"
|
||||||
license=('LicenseRef-AGPL-3.0-only-OpenSSL')
|
license=('LicenseRef-AGPL-3.0-only-OpenSSL')
|
||||||
depends=('curl' 'ffmpeg' 'fftw' 'gcc-libs' 'glibc' 'hicolor-icon-theme'
|
# the AppImage bundles Qt6, ffmpeg, SDL and the rest of the stack; these are
|
||||||
'hidapi' 'json-c' 'libidn2' 'libplacebo' 'libpsl' 'libssh2'
|
# what is left over
|
||||||
'miniupnpc' 'openssl' 'opus' 'qt6-base' 'qt6-declarative' 'qt6-svg'
|
depends=('glibc' 'gcc-libs' 'zlib' 'bzip2' 'brotli' 'expat' 'libgpg-error'
|
||||||
'qt6-webengine' 'sdl2' 'speexdsp' 'zlib')
|
'e2fsprogs' 'fontconfig' 'freetype2' 'alsa-lib' 'libx11' 'libxcb'
|
||||||
|
'libdrm' 'libva' 'libglvnd' 'mesa' 'vulkan-icd-loader'
|
||||||
|
'hicolor-icon-theme')
|
||||||
optdepends=('intel-media-driver: vaapi backend for Intel GPUs [>= Broadwell]'
|
optdepends=('intel-media-driver: vaapi backend for Intel GPUs [>= Broadwell]'
|
||||||
'libva-intel-driver: vaapi backend for Intel GPUs [<= Haswell]'
|
'libva-intel-driver: vaapi backend for Intel GPUs [<= Haswell]'
|
||||||
'libva-mesa-driver: vaapi backend for AMD GPUs')
|
'libva-mesa-driver: vaapi backend for AMD GPUs')
|
||||||
provides=('chiaki-ng' 'chiaki')
|
provides=('chiaki-ng' 'chiaki')
|
||||||
conflicts=('chiaki-ng' 'chiaki')
|
conflicts=('chiaki-ng' 'chiaki')
|
||||||
source=("${pkgname}-${pkgver}-${pkgrel}.tar.zst::https://github.com/Felitendo/PKGBUILDS/releases/download/${pkgname}-${pkgver}/${pkgname}-${pkgver}.tar.zst")
|
options=('!strip' '!debug')
|
||||||
sha256sums=('76c55be0342c651a65ffe5df5ed14930d43b844590cac9f4ea67d23e80557599')
|
source=("${pkgname}-${pkgver}.AppImage::https://github.com/streetpea/chiaki-ng/releases/download/v${pkgver}/chiaki-ng.AppImage_x86_64"
|
||||||
|
"COPYING-${pkgver}::https://raw.githubusercontent.com/streetpea/chiaki-ng/v${pkgver}/COPYING")
|
||||||
|
noextract=("${pkgname}-${pkgver}.AppImage")
|
||||||
|
sha256sums=('cac42c21a19a111f2f0729bb9eef7d3878c6d2a4f06e017d383aff2aba719fd3' 'fff3acb5eddbde97746cc1ad2082a1e95f50c2315a8748b26b8a81a499d8d216')
|
||||||
|
|
||||||
|
prepare() {
|
||||||
|
chmod +x "$srcdir/${pkgname}-${pkgver}.AppImage"
|
||||||
|
"$srcdir/${pkgname}-${pkgver}.AppImage" --appimage-extract > /dev/null
|
||||||
|
}
|
||||||
|
|
||||||
package() {
|
package() {
|
||||||
cp -a "$srcdir/usr" "$pkgdir/"
|
local _root="$srcdir/squashfs-root"
|
||||||
|
|
||||||
|
# upstream's AppImage payload, installed unchanged
|
||||||
|
install -d "$pkgdir/opt/$pkgname"
|
||||||
|
cp -a "$_root/." "$pkgdir/opt/$pkgname/"
|
||||||
|
rm -f "$pkgdir/opt/$pkgname/.DirIcon"
|
||||||
|
|
||||||
|
# the binaries carry a RUNPATH into the bundle and read the qt.conf next to
|
||||||
|
# them, so they have to be exec'd where they are
|
||||||
|
install -d "$pkgdir/usr/bin"
|
||||||
|
local _bin
|
||||||
|
for _bin in chiaki chiaki-cli; do
|
||||||
|
cat > "$pkgdir/usr/bin/$_bin" << EOF
|
||||||
|
#!/bin/sh
|
||||||
|
exec /opt/$pkgname/usr/bin/$_bin "\$@"
|
||||||
|
EOF
|
||||||
|
chmod 755 "$pkgdir/usr/bin/$_bin"
|
||||||
|
done
|
||||||
|
|
||||||
|
install -Dm644 "$_root/usr/share/applications/chiaking.desktop" \
|
||||||
|
"$pkgdir/usr/share/applications/chiaking.desktop"
|
||||||
|
install -Dm644 "$_root/usr/share/metainfo/io.github.streetpea.Chiaki4deck.appdata.xml" \
|
||||||
|
"$pkgdir/usr/share/metainfo/io.github.streetpea.Chiaki4deck.appdata.xml"
|
||||||
|
install -Dm644 "$_root/usr/share/icons/hicolor/512x512/apps/chiaking.png" \
|
||||||
|
"$pkgdir/usr/share/icons/hicolor/512x512/apps/chiaking.png"
|
||||||
|
|
||||||
|
# AGPL-3.0-only-OpenSSL is not a common license, ship the text
|
||||||
|
install -Dm644 "$srcdir/COPYING-${pkgver}" \
|
||||||
|
"$pkgdir/usr/share/licenses/$pkgname/COPYING"
|
||||||
}
|
}
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
--- a/gui/CMakeLists.txt 2025-10-11 20:52:37.048868767 +0100
|
|
||||||
+++ b/gui/CMakeLists.txt 2025-10-11 20:52:42.506427662 +0100
|
|
||||||
@@ -7,7 +7,7 @@
|
|
||||||
enable_language(OBJCXX)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
-find_package(Qt6 REQUIRED COMPONENTS Core Gui Concurrent Svg Qml Quick Widgets)
|
|
||||||
+find_package(Qt6 REQUIRED COMPONENTS Core Gui Concurrent Svg Qml Quick Widgets GuiPrivate)
|
|
||||||
find_package(Qt6 COMPONENTS WebEngineQuick)
|
|
||||||
find_package(Qt6 COMPONENTS DBus)
|
|
||||||
|
|
||||||
@@ -154,4 +154,4 @@
|
|
||||||
BUNDLE DESTINATION bin)
|
|
||||||
install(FILES chiaking.desktop DESTINATION share/applications)
|
|
||||||
install(FILES chiaking.png DESTINATION share/icons/hicolor/512x512/apps)
|
|
||||||
-install(FILES io.github.streetpea.Chiaki4deck.appdata.xml DESTINATION share/metainfo)
|
|
||||||
\ No newline at end of file
|
|
||||||
+install(FILES io.github.streetpea.Chiaki4deck.appdata.xml DESTINATION share/metainfo)
|
|
||||||
+15
-49
@@ -1,60 +1,26 @@
|
|||||||
# chiaki-ng-bin - prebuilt package of https://github.com/streetpea/chiaki-ng
|
# chiaki-ng-bin - chiaki-ng (https://github.com/streetpea/chiaki-ng), a free
|
||||||
# (free PlayStation Remote Play client, C/C++ + Qt6).
|
# PlayStation Remote Play client (C/C++ + Qt6).
|
||||||
#
|
#
|
||||||
# Upstream ships no plain Linux binaries (only AppImage/flatpak), so
|
# Upstream publishes an AppImage per release, which the PKGBUILD unpacks and
|
||||||
# build_artifact() builds from a git checkout of the release tag (the source
|
# installs into /opt - so there is no build step here, only pkgver and the
|
||||||
# tarballs lack the required submodules). Mirrors the AUR source package:
|
# checksums are refreshed on a new version. The license texts are not part of
|
||||||
# system curl instead of the vendored submodule, plus the Qt6GuiPrivate
|
# the AppImage and come from the matching source tag.
|
||||||
# CMake fix carried in this directory.
|
|
||||||
|
|
||||||
UPSTREAM_REPO="streetpea/chiaki-ng"
|
UPSTREAM_REPO="streetpea/chiaki-ng"
|
||||||
|
|
||||||
# Installed in CI (pacman) before build_artifact runs.
|
|
||||||
BUILD_DEPS=(cmake git python-protobuf python-setuptools protobuf
|
|
||||||
vulkan-headers qt6-base qt6-declarative qt6-svg qt6-webengine
|
|
||||||
sdl2 ffmpeg fftw hidapi json-c libplacebo miniupnpc opus speexdsp
|
|
||||||
openssl curl libssh2)
|
|
||||||
|
|
||||||
latest_version() {
|
latest_version() {
|
||||||
gh api "repos/$UPSTREAM_REPO/releases/latest" --jq '.tag_name' | sed 's/^v//'
|
gh api "repos/$UPSTREAM_REPO/releases/latest" --jq '.tag_name' | sed 's/^v//'
|
||||||
}
|
}
|
||||||
|
|
||||||
# build_artifact <version> <output-file>
|
# refresh_checksums <version> <pkgbuild-path>
|
||||||
build_artifact() {
|
refresh_checksums() {
|
||||||
local ver="$1" outfile="$2"
|
local ver="$1" pkgbuild="$2"
|
||||||
local pkgdir workdir destdir srctree
|
local sha_img sha_lic
|
||||||
pkgdir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
||||||
workdir="$(mktemp -d)"
|
|
||||||
destdir="$(mktemp -d)"
|
|
||||||
srctree="$workdir/src"
|
|
||||||
|
|
||||||
git clone --branch "v$ver" --depth 1 "https://github.com/$UPSTREAM_REPO.git" "$srctree"
|
sha_img="$(curl -sfL "https://github.com/$UPSTREAM_REPO/releases/download/v$ver/chiaki-ng.AppImage_x86_64" \
|
||||||
|
| sha256sum | cut -d' ' -f1)"
|
||||||
|
sha_lic="$(curl -sfL "https://raw.githubusercontent.com/$UPSTREAM_REPO/v$ver/COPYING" \
|
||||||
|
| sha256sum | cut -d' ' -f1)"
|
||||||
|
|
||||||
# use the system curl instead of the vendored submodule
|
sed -i "s|^sha256sums=.*|sha256sums=('$sha_img' '$sha_lic')|" "$pkgbuild"
|
||||||
git -C "$srctree" rm -q third-party/curl
|
|
||||||
sed -i 's:libcurl_shared:libcurl:' "$srctree/lib/CMakeLists.txt"
|
|
||||||
# newer tags (>= 1.10.0) carry the GuiPrivate fix themselves
|
|
||||||
if ! grep -q 'GuiPrivate' "$srctree/gui/CMakeLists.txt"; then
|
|
||||||
patch -d "$srctree" -p1 < "$pkgdir/Qt6GuiPrivate-fix.patch"
|
|
||||||
fi
|
|
||||||
git -C "$srctree" submodule update --init
|
|
||||||
|
|
||||||
CFLAGS="${CFLAGS:-} -std=gnu17" cmake -B "$workdir/build" -S "$srctree" -Wno-dev \
|
|
||||||
-DCMAKE_BUILD_TYPE=Release \
|
|
||||||
-DCMAKE_INSTALL_PREFIX=/usr \
|
|
||||||
-DCHIAKI_USE_SYSTEM_CURL=ON
|
|
||||||
cmake --build "$workdir/build" -j"$(nproc)"
|
|
||||||
DESTDIR="$destdir" cmake --install "$workdir/build"
|
|
||||||
|
|
||||||
# AGPL-3.0-only-OpenSSL: not a common license, ship the texts
|
|
||||||
mkdir -p "$destdir/usr/share/licenses/chiaki-ng-bin"
|
|
||||||
install -m644 "$srctree/LICENSES/"* "$destdir/usr/share/licenses/chiaki-ng-bin/"
|
|
||||||
|
|
||||||
rm -f "$destdir/usr/share/applications/mimeinfo.cache" \
|
|
||||||
"$destdir/usr/share/icons/hicolor/icon-theme.cache"
|
|
||||||
|
|
||||||
tar --zstd --sort=name --owner=0 --group=0 --numeric-owner --mtime='@0' \
|
|
||||||
-cf "$outfile" -C "$destdir" usr
|
|
||||||
|
|
||||||
rm -rf "$workdir" "$destdir"
|
|
||||||
}
|
}
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
# Maintainer: Felitendo
|
|
||||||
# This PKGBUILD is updated automatically:
|
|
||||||
# https://github.com/Felitendo/PKGBUILDS
|
|
||||||
|
|
||||||
pkgname=chromium-widevine-helper-bin
|
|
||||||
pkgver=1.0.8
|
|
||||||
pkgrel=1
|
|
||||||
pkgdesc="Extension + native helper that installs Google's Widevine CDM into Chromium-based browser profiles (prebuilt)"
|
|
||||||
arch=('any')
|
|
||||||
url="https://github.com/GloriousEggroll/chromium-widevine-helper"
|
|
||||||
license=('GPL-3.0-only')
|
|
||||||
depends=('python' 'procps-ng' 'ca-certificates')
|
|
||||||
provides=('chromium-widevine-helper')
|
|
||||||
conflicts=('chromium-widevine-helper')
|
|
||||||
backup=('etc/helium/native-messaging-hosts/org.chromium.widevine.json'
|
|
||||||
'etc/net.imput.helium/native-messaging-hosts/org.chromium.widevine.json'
|
|
||||||
'etc/chromium/native-messaging-hosts/org.chromium.widevine.json'
|
|
||||||
'etc/chromium-browser/native-messaging-hosts/org.chromium.widevine.json'
|
|
||||||
'etc/opt/chrome/native-messaging-hosts/org.chromium.widevine.json'
|
|
||||||
'etc/opt/edge/native-messaging-hosts/org.chromium.widevine.json'
|
|
||||||
'etc/brave/native-messaging-hosts/org.chromium.widevine.json'
|
|
||||||
'etc/vivaldi/native-messaging-hosts/org.chromium.widevine.json'
|
|
||||||
'etc/opera/native-messaging-hosts/org.chromium.widevine.json'
|
|
||||||
'etc/thorium/native-messaging-hosts/org.chromium.widevine.json'
|
|
||||||
'etc/iridium/native-messaging-hosts/org.chromium.widevine.json')
|
|
||||||
source=("${pkgname}-${pkgver}-${pkgrel}.tar.zst::https://github.com/Felitendo/PKGBUILDS/releases/download/${pkgname}-${pkgver}/${pkgname}-${pkgver}.tar.zst")
|
|
||||||
sha256sums=('efb70f082652176710b403a2629333220c1b8b96e3f27f398ba7efb496982829')
|
|
||||||
|
|
||||||
package() {
|
|
||||||
cp -a "$srcdir/usr" "$srcdir/etc" "$pkgdir/"
|
|
||||||
}
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
# chromium-widevine-helper-bin - prebuilt package of
|
|
||||||
# https://github.com/GloriousEggroll/chromium-widevine-helper
|
|
||||||
# (Chromium extension + native messaging helper that installs Google's
|
|
||||||
# Widevine CDM into Chromium-based browser profiles).
|
|
||||||
#
|
|
||||||
# Upstream publishes neither releases nor tags; the canonical version lives in
|
|
||||||
# the Fedora RPM spec on the main branch. build_artifact() snapshots main,
|
|
||||||
# verifies the snapshot still carries the requested version and assembles the
|
|
||||||
# install tree following upstream's spec - with Fedora's /usr/libexec
|
|
||||||
# relocated to /usr/lib, which Arch uses instead.
|
|
||||||
|
|
||||||
UPSTREAM_REPO="GloriousEggroll/chromium-widevine-helper"
|
|
||||||
SPEC_PATH="Packaging/rpm/chromium-widevine-helper.spec"
|
|
||||||
|
|
||||||
# Pure noarch install tree (Python script + JSON + extension assets).
|
|
||||||
BUILD_DEPS=()
|
|
||||||
|
|
||||||
spec_version() {
|
|
||||||
grep -Po '^%global helper_version \K[0-9.]+'
|
|
||||||
}
|
|
||||||
|
|
||||||
latest_version() {
|
|
||||||
curl -sf "https://raw.githubusercontent.com/$UPSTREAM_REPO/main/$SPEC_PATH" \
|
|
||||||
| spec_version
|
|
||||||
}
|
|
||||||
|
|
||||||
# build_artifact <version> <output-file>
|
|
||||||
build_artifact() {
|
|
||||||
local ver="$1" outfile="$2"
|
|
||||||
local workdir destdir
|
|
||||||
workdir="$(mktemp -d)"
|
|
||||||
destdir="$(mktemp -d)"
|
|
||||||
|
|
||||||
curl -sfL "https://github.com/$UPSTREAM_REPO/archive/refs/heads/main.tar.gz" \
|
|
||||||
| tar -xz -C "$workdir" --strip-components=1
|
|
||||||
|
|
||||||
# main may have moved between the version check and this download.
|
|
||||||
local specver
|
|
||||||
specver="$(spec_version < "$workdir/$SPEC_PATH")"
|
|
||||||
if [[ "$specver" != "$ver" ]]; then
|
|
||||||
echo "snapshot of main is $specver, not the requested $ver - try again" >&2
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
install -Dm755 "$workdir/helper/chromium-widevine" \
|
|
||||||
"$destdir/usr/lib/chromium-widevine/chromium-widevine"
|
|
||||||
install -d "$destdir/usr/bin"
|
|
||||||
ln -s /usr/lib/chromium-widevine/chromium-widevine "$destdir/usr/bin/chromium-widevine"
|
|
||||||
|
|
||||||
# The extension is shipped so it can be loaded unpacked from
|
|
||||||
# chrome://extensions (chromium-widevine --install-native-hosts then
|
|
||||||
# registers whatever ID the browser assigned it).
|
|
||||||
mkdir -p "$destdir/usr/share/chromium-widevine"
|
|
||||||
cp -a "$workdir/extension" "$destdir/usr/share/chromium-widevine/extension"
|
|
||||||
find "$destdir/usr/share/chromium-widevine" -type d -exec chmod 755 {} +
|
|
||||||
find "$destdir/usr/share/chromium-widevine" -type f -exec chmod 644 {} +
|
|
||||||
|
|
||||||
install -Dm644 "$workdir/README.md" \
|
|
||||||
"$destdir/usr/share/doc/chromium-widevine-helper-bin/README.md"
|
|
||||||
|
|
||||||
# System-wide native messaging host manifests for the same browser lookup
|
|
||||||
# roots upstream's RPM covers.
|
|
||||||
local hostdir
|
|
||||||
for hostdir in helium net.imput.helium chromium chromium-browser \
|
|
||||||
opt/chrome opt/edge brave vivaldi opera thorium iridium; do
|
|
||||||
install -Dm644 "$workdir/helper/chromium-widevine-native-host.json" \
|
|
||||||
"$destdir/etc/$hostdir/native-messaging-hosts/org.chromium.widevine.json"
|
|
||||||
done
|
|
||||||
# The upstream manifest hardcodes Fedora's /usr/libexec helper path.
|
|
||||||
find "$destdir/etc" -name 'org.chromium.widevine.json' -exec \
|
|
||||||
sed -i 's|/usr/libexec/chromium-widevine/|/usr/lib/chromium-widevine/|' {} +
|
|
||||||
|
|
||||||
tar --zstd --sort=name --owner=0 --group=0 --numeric-owner --mtime='@0' \
|
|
||||||
-cf "$outfile" -C "$destdir" usr etc
|
|
||||||
|
|
||||||
rm -rf "$workdir" "$destdir"
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
pkgbase = chromium-widevine-helper-bin
|
pkgbase = chromium-widevine-helper
|
||||||
pkgdesc = Extension + native helper that installs Google's Widevine CDM into Chromium-based browser profiles (prebuilt)
|
pkgdesc = Extension + native helper that installs Google's Widevine CDM into Chromium-based browser profiles
|
||||||
pkgver = 1.0.8
|
pkgver = 1.0.9
|
||||||
pkgrel = 1
|
pkgrel = 1
|
||||||
url = https://github.com/GloriousEggroll/chromium-widevine-helper
|
url = https://github.com/GloriousEggroll/chromium-widevine-helper
|
||||||
arch = any
|
arch = any
|
||||||
@@ -8,8 +8,6 @@ pkgbase = chromium-widevine-helper-bin
|
|||||||
depends = python
|
depends = python
|
||||||
depends = procps-ng
|
depends = procps-ng
|
||||||
depends = ca-certificates
|
depends = ca-certificates
|
||||||
provides = chromium-widevine-helper
|
|
||||||
conflicts = chromium-widevine-helper
|
|
||||||
backup = etc/helium/native-messaging-hosts/org.chromium.widevine.json
|
backup = etc/helium/native-messaging-hosts/org.chromium.widevine.json
|
||||||
backup = etc/net.imput.helium/native-messaging-hosts/org.chromium.widevine.json
|
backup = etc/net.imput.helium/native-messaging-hosts/org.chromium.widevine.json
|
||||||
backup = etc/chromium/native-messaging-hosts/org.chromium.widevine.json
|
backup = etc/chromium/native-messaging-hosts/org.chromium.widevine.json
|
||||||
@@ -21,7 +19,7 @@ pkgbase = chromium-widevine-helper-bin
|
|||||||
backup = etc/opera/native-messaging-hosts/org.chromium.widevine.json
|
backup = etc/opera/native-messaging-hosts/org.chromium.widevine.json
|
||||||
backup = etc/thorium/native-messaging-hosts/org.chromium.widevine.json
|
backup = etc/thorium/native-messaging-hosts/org.chromium.widevine.json
|
||||||
backup = etc/iridium/native-messaging-hosts/org.chromium.widevine.json
|
backup = etc/iridium/native-messaging-hosts/org.chromium.widevine.json
|
||||||
source = chromium-widevine-helper-bin-1.0.8-1.tar.zst::https://github.com/Felitendo/PKGBUILDS/releases/download/chromium-widevine-helper-bin-1.0.8/chromium-widevine-helper-bin-1.0.8.tar.zst
|
source = chromium-widevine-helper-1.0.9.tar.gz::https://github.com/GloriousEggroll/chromium-widevine-helper/archive/586b42ceb035f3202a2d23ee156ecd987567ba2f.tar.gz
|
||||||
sha256sums = efb70f082652176710b403a2629333220c1b8b96e3f27f398ba7efb496982829
|
sha256sums = ae59742c78f0942599d1bfcd5e067f113c11bbc049a31d1b3a6dab9ab45ecb63
|
||||||
|
|
||||||
pkgname = chromium-widevine-helper-bin
|
pkgname = chromium-widevine-helper
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
# Maintainer: Felitendo
|
||||||
|
# This PKGBUILD is updated automatically:
|
||||||
|
# https://git.felo.gg/Felitendo/PKGBUILDS
|
||||||
|
|
||||||
|
pkgname=chromium-widevine-helper
|
||||||
|
pkgver=1.0.9
|
||||||
|
pkgrel=1
|
||||||
|
pkgdesc="Extension + native helper that installs Google's Widevine CDM into Chromium-based browser profiles"
|
||||||
|
arch=('any')
|
||||||
|
url="https://github.com/GloriousEggroll/chromium-widevine-helper"
|
||||||
|
license=('GPL-3.0-only')
|
||||||
|
depends=('python' 'procps-ng' 'ca-certificates')
|
||||||
|
backup=('etc/helium/native-messaging-hosts/org.chromium.widevine.json'
|
||||||
|
'etc/net.imput.helium/native-messaging-hosts/org.chromium.widevine.json'
|
||||||
|
'etc/chromium/native-messaging-hosts/org.chromium.widevine.json'
|
||||||
|
'etc/chromium-browser/native-messaging-hosts/org.chromium.widevine.json'
|
||||||
|
'etc/opt/chrome/native-messaging-hosts/org.chromium.widevine.json'
|
||||||
|
'etc/opt/edge/native-messaging-hosts/org.chromium.widevine.json'
|
||||||
|
'etc/brave/native-messaging-hosts/org.chromium.widevine.json'
|
||||||
|
'etc/vivaldi/native-messaging-hosts/org.chromium.widevine.json'
|
||||||
|
'etc/opera/native-messaging-hosts/org.chromium.widevine.json'
|
||||||
|
'etc/thorium/native-messaging-hosts/org.chromium.widevine.json'
|
||||||
|
'etc/iridium/native-messaging-hosts/org.chromium.widevine.json')
|
||||||
|
# Upstream publishes neither releases nor tags; the canonical version lives in
|
||||||
|
# %global helper_version in Packaging/rpm/chromium-widevine-helper.spec. The
|
||||||
|
# package is pinned to the commit that carries the packaged version, so it is
|
||||||
|
# tied to a specific version and needs no -git suffix.
|
||||||
|
_commit="586b42ceb035f3202a2d23ee156ecd987567ba2f"
|
||||||
|
source=("${pkgname}-${pkgver}.tar.gz::${url}/archive/${_commit}.tar.gz")
|
||||||
|
sha256sums=('ae59742c78f0942599d1bfcd5e067f113c11bbc049a31d1b3a6dab9ab45ecb63')
|
||||||
|
|
||||||
|
prepare() {
|
||||||
|
local _specver
|
||||||
|
_specver="$(grep -Po '^%global helper_version \K[0-9.]+' \
|
||||||
|
"${pkgname}-${_commit}/Packaging/rpm/chromium-widevine-helper.spec")"
|
||||||
|
[[ "$_specver" == "$pkgver" ]] || {
|
||||||
|
echo "pinned commit declares $_specver, expected $pkgver" >&2
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
package() {
|
||||||
|
cd "${pkgname}-${_commit}"
|
||||||
|
|
||||||
|
# Fedora's /usr/libexec, which Arch does not use
|
||||||
|
install -Dm755 helper/chromium-widevine \
|
||||||
|
"$pkgdir/usr/lib/chromium-widevine/chromium-widevine"
|
||||||
|
install -d "$pkgdir/usr/bin"
|
||||||
|
ln -s /usr/lib/chromium-widevine/chromium-widevine \
|
||||||
|
"$pkgdir/usr/bin/chromium-widevine"
|
||||||
|
|
||||||
|
# The extension is shipped so it can be loaded unpacked from
|
||||||
|
# chrome://extensions (chromium-widevine --install-native-hosts then
|
||||||
|
# registers whatever ID the browser assigned it).
|
||||||
|
install -d "$pkgdir/usr/share/chromium-widevine"
|
||||||
|
cp -a extension "$pkgdir/usr/share/chromium-widevine/extension"
|
||||||
|
find "$pkgdir/usr/share/chromium-widevine" -type d -exec chmod 755 {} +
|
||||||
|
find "$pkgdir/usr/share/chromium-widevine" -type f -exec chmod 644 {} +
|
||||||
|
|
||||||
|
# upstream ships no license file; GPL-3.0-only is a common license
|
||||||
|
install -Dm644 README.md "$pkgdir/usr/share/doc/$pkgname/README.md"
|
||||||
|
|
||||||
|
# System-wide native messaging host manifests for the same browser lookup
|
||||||
|
# roots upstream's RPM covers.
|
||||||
|
local _hostdir
|
||||||
|
for _hostdir in helium net.imput.helium chromium chromium-browser \
|
||||||
|
opt/chrome opt/edge brave vivaldi opera thorium iridium; do
|
||||||
|
install -Dm644 helper/chromium-widevine-native-host.json \
|
||||||
|
"$pkgdir/etc/$_hostdir/native-messaging-hosts/org.chromium.widevine.json"
|
||||||
|
done
|
||||||
|
find "$pkgdir/etc" -name 'org.chromium.widevine.json' -exec \
|
||||||
|
sed -i 's|/usr/libexec/chromium-widevine/|/usr/lib/chromium-widevine/|' {} +
|
||||||
|
}
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
# chromium-widevine-helper - Chromium extension + native messaging helper
|
||||||
|
# that installs Google's Widevine CDM into Chromium-based browser profiles
|
||||||
|
# (https://github.com/GloriousEggroll/chromium-widevine-helper).
|
||||||
|
#
|
||||||
|
# Upstream publishes neither releases nor tags; the canonical version lives in
|
||||||
|
# the Fedora RPM spec on the main branch. The package pins the main commit
|
||||||
|
# that carries that version, so it stays tied to a specific version (no -git
|
||||||
|
# suffix) - refresh_checksums() moves the pin along with the version.
|
||||||
|
#
|
||||||
|
# Nothing is compiled: the payload is a Python script, JSON manifests and the
|
||||||
|
# extension assets, so package() alone does the work.
|
||||||
|
|
||||||
|
UPSTREAM_REPO="GloriousEggroll/chromium-widevine-helper"
|
||||||
|
SPEC_PATH="Packaging/rpm/chromium-widevine-helper.spec"
|
||||||
|
|
||||||
|
BUILD_DEPS=()
|
||||||
|
|
||||||
|
spec_version() {
|
||||||
|
grep -Po '^%global helper_version \K[0-9.]+'
|
||||||
|
}
|
||||||
|
|
||||||
|
latest_version() {
|
||||||
|
curl -sf "https://raw.githubusercontent.com/$UPSTREAM_REPO/main/$SPEC_PATH" \
|
||||||
|
| spec_version
|
||||||
|
}
|
||||||
|
|
||||||
|
# refresh_checksums <version> <pkgbuild-path>
|
||||||
|
refresh_checksums() {
|
||||||
|
local ver="$1" pkgbuild="$2"
|
||||||
|
local commit specver sha
|
||||||
|
|
||||||
|
commit="$(gh api "repos/$UPSTREAM_REPO/commits/main" --jq '.sha')"
|
||||||
|
|
||||||
|
# main may have moved between the version check and this lookup
|
||||||
|
specver="$(curl -sf "https://raw.githubusercontent.com/$UPSTREAM_REPO/$commit/$SPEC_PATH" \
|
||||||
|
| spec_version)"
|
||||||
|
if [[ "$specver" != "$ver" ]]; then
|
||||||
|
echo "main is at $specver, not the requested $ver - try again" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
sha="$(curl -sfL "https://github.com/$UPSTREAM_REPO/archive/$commit.tar.gz" \
|
||||||
|
| sha256sum | cut -d' ' -f1)"
|
||||||
|
|
||||||
|
sed -i \
|
||||||
|
-e "s|^_commit=.*|_commit=\"$commit\"|" \
|
||||||
|
-e "s|^sha256sums=.*|sha256sums=('$sha')|" \
|
||||||
|
"$pkgbuild"
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
pkgbase = concat-bin
|
||||||
|
pkgdesc = Free and open-source CapCut replacement, a video editor with a Rust engine (upstream binary)
|
||||||
|
pkgver = 0.2.5
|
||||||
|
pkgrel = 1
|
||||||
|
url = https://github.com/jub0t/Concat
|
||||||
|
arch = x86_64
|
||||||
|
arch = aarch64
|
||||||
|
license = AGPL-3.0-or-later
|
||||||
|
license = GPL-3.0-or-later
|
||||||
|
depends = alsa-lib
|
||||||
|
depends = fontconfig
|
||||||
|
depends = freetype2
|
||||||
|
depends = libglvnd
|
||||||
|
depends = libxkbcommon
|
||||||
|
depends = libxkbcommon-x11
|
||||||
|
depends = libx11
|
||||||
|
depends = libxcursor
|
||||||
|
depends = libxi
|
||||||
|
depends = libxrender
|
||||||
|
depends = wayland
|
||||||
|
depends = dbus
|
||||||
|
depends = gcc-libs
|
||||||
|
depends = glibc
|
||||||
|
depends = hicolor-icon-theme
|
||||||
|
provides = concat
|
||||||
|
conflicts = concat
|
||||||
|
noextract = concat-bin-0.2.5-x86_64.deb
|
||||||
|
noextract = concat-bin-0.2.5-aarch64.deb
|
||||||
|
options = !strip
|
||||||
|
options = !debug
|
||||||
|
source_x86_64 = concat-bin-0.2.5-x86_64.deb::https://github.com/jub0t/Concat/releases/download/v0.2.5/Concat-0.2.5-linux-x86_64.deb
|
||||||
|
sha256sums_x86_64 = e93817f911d8e581645786c52ddbadde16abe715b3c3c7a2550ce042313d2828
|
||||||
|
source_aarch64 = concat-bin-0.2.5-aarch64.deb::https://github.com/jub0t/Concat/releases/download/v0.2.5/Concat-0.2.5-linux-aarch64.deb
|
||||||
|
sha256sums_aarch64 = 38e23c6629740cebc24051d92eb4d2475ac9fe58b35eed70653f9c14546926b8
|
||||||
|
|
||||||
|
pkgname = concat-bin
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
# Maintainer: Felitendo
|
||||||
|
# This PKGBUILD is updated automatically:
|
||||||
|
# https://git.felo.gg/Felitendo/PKGBUILDS
|
||||||
|
|
||||||
|
pkgname=concat-bin
|
||||||
|
pkgver=0.2.5
|
||||||
|
pkgrel=1
|
||||||
|
pkgdesc="Free and open-source CapCut replacement, a video editor with a Rust engine (upstream binary)"
|
||||||
|
arch=('x86_64' 'aarch64')
|
||||||
|
url="https://github.com/jub0t/Concat"
|
||||||
|
# The binary is Concat under the AGPL; the FFmpeg libraries it ships beside
|
||||||
|
# itself are a GPL build. Both licence texts land in the package: the
|
||||||
|
# repository's LICENSE, and upstream's notices file, which is what names the
|
||||||
|
# terms of everything linked in - FFmpeg, Slint under its GPL option,
|
||||||
|
# whisper.cpp, sherpa-onnx.
|
||||||
|
license=('AGPL-3.0-or-later' 'GPL-3.0-or-later')
|
||||||
|
# Nothing is spawned at run time: FFmpeg is linked, whisper.cpp and
|
||||||
|
# sherpa-onnx are compiled in, and ONNX Runtime ships in the same lib/
|
||||||
|
# directory. What is left is what the binary loads by name - the ALSA backend
|
||||||
|
# of cpal, fontconfig and freetype for text, and the windowing libraries
|
||||||
|
# winit and the renderer open: EGL, Wayland, X11 and xkbcommon. dbus is the
|
||||||
|
# XDG portal, which is how the file dialogs and "reveal in file manager" work
|
||||||
|
# without a toolkit.
|
||||||
|
depends=('alsa-lib' 'fontconfig' 'freetype2' 'libglvnd' 'libxkbcommon'
|
||||||
|
'libxkbcommon-x11' 'libx11' 'libxcursor' 'libxi' 'libxrender'
|
||||||
|
'wayland' 'dbus' 'gcc-libs' 'glibc' 'hicolor-icon-theme')
|
||||||
|
provides=('concat')
|
||||||
|
conflicts=('concat')
|
||||||
|
# !strip: upstream's binary is already stripped, and the FFmpeg and ONNX
|
||||||
|
# Runtime libraries beside it are theirs to ship as they are.
|
||||||
|
options=('!strip' '!debug')
|
||||||
|
# Upstream's Linux packages carry one self-contained folder: the binary and
|
||||||
|
# the libraries it was linked against - FFmpeg 8 (Arch is on 9) and ONNX
|
||||||
|
# Runtime, the cutout models' runtime. They go to /opt/concat, where the
|
||||||
|
# binary's own rpath ($ORIGIN/lib) finds them, which is also where upstream's
|
||||||
|
# .deb puts them and what its desktop entry points at.
|
||||||
|
#
|
||||||
|
# Of the three Linux artifacts - .deb, .rpm and AppImage - the .deb is the
|
||||||
|
# plain one: an ar archive around that folder, with no runtime wrapped around
|
||||||
|
# it and nothing to mount.
|
||||||
|
#
|
||||||
|
# The asset name carries the workspace's version, not the tag (a prerelease of
|
||||||
|
# 0.2.4 ships Concat-0.2.4-linux-x86_64.deb whatever its tag says), so both
|
||||||
|
# the tag and that version are resolved through the release manifest and
|
||||||
|
# synced here along with the checksums; see pkg.sh.
|
||||||
|
_tag="v0.2.5"
|
||||||
|
_relver="0.2.5"
|
||||||
|
source_x86_64=("${pkgname}-${pkgver}-x86_64.deb::https://github.com/jub0t/Concat/releases/download/${_tag}/Concat-${_relver}-linux-x86_64.deb")
|
||||||
|
source_aarch64=("${pkgname}-${pkgver}-aarch64.deb::https://github.com/jub0t/Concat/releases/download/${_tag}/Concat-${_relver}-linux-aarch64.deb")
|
||||||
|
noextract=("${pkgname}-${pkgver}-x86_64.deb" "${pkgname}-${pkgver}-aarch64.deb")
|
||||||
|
sha256sums_x86_64=('e93817f911d8e581645786c52ddbadde16abe715b3c3c7a2550ce042313d2828')
|
||||||
|
sha256sums_aarch64=('38e23c6629740cebc24051d92eb4d2475ac9fe58b35eed70653f9c14546926b8')
|
||||||
|
|
||||||
|
package() {
|
||||||
|
# -p: lib/ is the usual set of soname symlinks beside the real files, and
|
||||||
|
# only an extraction that preserves them keeps the rpath working.
|
||||||
|
bsdtar -xOf "$srcdir/${pkgname}-${pkgver}-${CARCH}.deb" 'data.tar.*' \
|
||||||
|
| bsdtar -xpf - -C "$pkgdir" ./opt ./usr
|
||||||
|
|
||||||
|
# upstream ships them as documentation; on Arch they belong here
|
||||||
|
install -d "$pkgdir/usr/share/licenses"
|
||||||
|
mv "$pkgdir/usr/share/doc/concat" "$pkgdir/usr/share/licenses/$pkgname"
|
||||||
|
rmdir "$pkgdir/usr/share/doc"
|
||||||
|
}
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
# concat-bin - Concat (https://github.com/jub0t/Concat), a free and
|
||||||
|
# open-source CapCut replacement.
|
||||||
|
#
|
||||||
|
# Upstream builds the Linux release itself, so there is no build step here:
|
||||||
|
# on a new version the tag, the asset version and the checksums are refreshed
|
||||||
|
# and the PKGBUILD repackages upstream's .deb.
|
||||||
|
#
|
||||||
|
# 0.2.3 replaced the self-contained tarball this package used to take with a
|
||||||
|
# .deb, an .rpm and an AppImage, each for x86_64 and aarch64. Every release
|
||||||
|
# also carries a manifest.json listing each artifact with its sha256, so a
|
||||||
|
# new version costs two API calls and no download.
|
||||||
|
#
|
||||||
|
# The release list is not ordered by version: GitHub sorts it by creation
|
||||||
|
# time, and upstream's alpha numbering has run out of step with it before
|
||||||
|
# (v0.2.0-alpha.10 sat between alpha.2 and alpha.1). The newest release is
|
||||||
|
# therefore picked by publication date rather than by list position. Only
|
||||||
|
# tags that start with a version are considered, which is also what keeps the
|
||||||
|
# rolling "nightly" prerelease out.
|
||||||
|
#
|
||||||
|
# The asset name carries the workspace's version, not the tag - a prerelease
|
||||||
|
# of 0.2.4 ships Concat-0.2.4-linux-x86_64.deb whatever its tag says - so it
|
||||||
|
# cannot be derived from pkgver and is read from the manifest into _relver.
|
||||||
|
#
|
||||||
|
# pkgver drops the hyphens from the tag (v0.2.4-alpha.1 -> 0.2.4alpha.1).
|
||||||
|
# pacman sorts that older than a later plain 0.2.4 (`vercmp 0.2.4alpha.1
|
||||||
|
# 0.2.4` is -1), so prereleases upgrade to the eventual release on their own
|
||||||
|
# and no epoch is needed.
|
||||||
|
|
||||||
|
UPSTREAM_REPO="jub0t/Concat"
|
||||||
|
|
||||||
|
# newest published release whose tag looks like a version
|
||||||
|
latest_tag() {
|
||||||
|
gh api "repos/$UPSTREAM_REPO/releases?per_page=100" \
|
||||||
|
--jq '[.[] | select(.draft | not) | select(.tag_name | test("^v[0-9]"))]
|
||||||
|
| sort_by(.published_at) | last | .tag_name'
|
||||||
|
}
|
||||||
|
|
||||||
|
tag_to_pkgver() {
|
||||||
|
sed 's/^v//; s/-//g'
|
||||||
|
}
|
||||||
|
|
||||||
|
latest_version() {
|
||||||
|
latest_tag | tag_to_pkgver
|
||||||
|
}
|
||||||
|
|
||||||
|
# refresh_checksums <version> <pkgbuild-path>
|
||||||
|
refresh_checksums() {
|
||||||
|
local ver="$1" pkgbuild="$2"
|
||||||
|
local tag manifest relver sha_x86_64 sha_aarch64 arch sha file
|
||||||
|
|
||||||
|
tag="$(latest_tag)"
|
||||||
|
if [[ "$(tag_to_pkgver <<< "$tag")" != "$ver" ]]; then
|
||||||
|
echo "newest versioned release is $tag, not the requested $ver - try again" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
manifest="$(curl -sfL "https://github.com/$UPSTREAM_REPO/releases/download/$tag/manifest.json")"
|
||||||
|
relver="$(jq -r '.version // empty' <<< "$manifest" 2>/dev/null)"
|
||||||
|
if [[ -z "$relver" ]]; then
|
||||||
|
echo "$tag carries no usable manifest.json" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Both the name and the checksum come from the manifest, and the name is
|
||||||
|
# checked against what the PKGBUILD builds from _relver: a release that
|
||||||
|
# renames its artifacts says so here instead of 404ing in the test build.
|
||||||
|
for arch in x86_64 aarch64; do
|
||||||
|
sha="$(jq -r --arg a "$arch" '.binaries.linux[$a].deb.sha256 // empty' <<< "$manifest")"
|
||||||
|
file="$(jq -r --arg a "$arch" '.binaries.linux[$a].deb.file // empty' <<< "$manifest")"
|
||||||
|
if [[ ! "$sha" =~ ^[0-9a-f]{64}$ || "$file" != "Concat-$relver-linux-$arch.deb" ]]; then
|
||||||
|
echo "$tag's manifest lists no Concat-$relver-linux-$arch.deb with a sha256" \
|
||||||
|
"(file: ${file:-none})" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
printf -v "sha_$arch" '%s' "$sha"
|
||||||
|
done
|
||||||
|
|
||||||
|
sed -i \
|
||||||
|
-e "s|^_tag=.*|_tag=\"$tag\"|" \
|
||||||
|
-e "s|^_relver=.*|_relver=\"$relver\"|" \
|
||||||
|
-e "s|^sha256sums_x86_64=.*|sha256sums_x86_64=('$sha_x86_64')|" \
|
||||||
|
-e "s|^sha256sums_aarch64=.*|sha256sums_aarch64=('$sha_aarch64')|" \
|
||||||
|
"$pkgbuild"
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
pkgbase = concat-git
|
||||||
|
pkgdesc = Free and open-source CapCut replacement, a video editor with a Rust engine (git)
|
||||||
|
pkgver = 0.2.1.r12.geef4579
|
||||||
|
pkgrel = 1
|
||||||
|
url = https://github.com/jub0t/Concat
|
||||||
|
arch = x86_64
|
||||||
|
license = AGPL-3.0-or-later
|
||||||
|
makedepends = rust
|
||||||
|
makedepends = cmake
|
||||||
|
makedepends = clang
|
||||||
|
makedepends = pkgconf
|
||||||
|
makedepends = git
|
||||||
|
depends = ffmpeg
|
||||||
|
depends = onnxruntime
|
||||||
|
depends = alsa-lib
|
||||||
|
depends = fontconfig
|
||||||
|
depends = freetype2
|
||||||
|
depends = libglvnd
|
||||||
|
depends = vulkan-icd-loader
|
||||||
|
depends = libxkbcommon
|
||||||
|
depends = libxkbcommon-x11
|
||||||
|
depends = libx11
|
||||||
|
depends = libxcursor
|
||||||
|
depends = libxi
|
||||||
|
depends = libxrender
|
||||||
|
depends = wayland
|
||||||
|
depends = dbus
|
||||||
|
depends = gcc-libs
|
||||||
|
depends = glibc
|
||||||
|
depends = hicolor-icon-theme
|
||||||
|
provides = concat
|
||||||
|
conflicts = concat
|
||||||
|
options = !debug
|
||||||
|
options = !lto
|
||||||
|
source = concat-git::git+https://github.com/jub0t/Concat.git
|
||||||
|
sha256sums = SKIP
|
||||||
|
|
||||||
|
pkgname = concat-git
|
||||||
@@ -0,0 +1,114 @@
|
|||||||
|
# Maintainer: Felitendo
|
||||||
|
# This PKGBUILD is updated automatically:
|
||||||
|
# https://git.felo.gg/Felitendo/PKGBUILDS
|
||||||
|
|
||||||
|
pkgname=concat-git
|
||||||
|
pkgver=0.2.1.r12.geef4579
|
||||||
|
pkgrel=1
|
||||||
|
pkgdesc="Free and open-source CapCut replacement, a video editor with a Rust engine (git)"
|
||||||
|
arch=('x86_64')
|
||||||
|
url="https://github.com/jub0t/Concat"
|
||||||
|
license=('AGPL-3.0-or-later')
|
||||||
|
# Nothing is spawned at run time: FFmpeg is linked, whisper.cpp and
|
||||||
|
# sherpa-onnx are compiled in. alsa-lib is cpal's playback backend;
|
||||||
|
# fontconfig and freetype are the font side of the renderer; libglvnd and
|
||||||
|
# vulkan-icd-loader are the two backends wgpu picks between, and the rest is
|
||||||
|
# what winit opens by name for whichever session the user is in. dbus is the
|
||||||
|
# XDG portal, which is how the file dialogs and "reveal in file manager"
|
||||||
|
# work without a toolkit. onnxruntime runs the cutout models and is linked
|
||||||
|
# dynamically, see ORT_LIB_LOCATION in build().
|
||||||
|
depends=('ffmpeg' 'onnxruntime' 'alsa-lib' 'fontconfig' 'freetype2'
|
||||||
|
'libglvnd' 'vulkan-icd-loader' 'libxkbcommon' 'libxkbcommon-x11'
|
||||||
|
'libx11' 'libxcursor' 'libxi' 'libxrender' 'wayland' 'dbus'
|
||||||
|
'gcc-libs' 'glibc' 'hicolor-icon-theme')
|
||||||
|
# clang: bindgen (FFmpeg headers, whisper.cpp) needs libclang.
|
||||||
|
# cmake: whisper.cpp is compiled in, by its own CMake build.
|
||||||
|
makedepends=('rust' 'cmake' 'clang' 'pkgconf' 'git')
|
||||||
|
provides=('concat')
|
||||||
|
conflicts=('concat')
|
||||||
|
# !debug: the app profile strips symbols itself, so there is nothing left to
|
||||||
|
# split into a debug package.
|
||||||
|
# !lto: makepkg's lto puts -flto=auto into CFLAGS, and ring - the crypto
|
||||||
|
# behind the model downloads' TLS - compiles hand-written assembly through
|
||||||
|
# cc, which comes out as bitcode and links to nothing. Rust's own LTO is set
|
||||||
|
# in the app profile and is unaffected.
|
||||||
|
options=('!debug' '!lto')
|
||||||
|
source=("${pkgname}::git+https://github.com/jub0t/Concat.git")
|
||||||
|
sha256sums=('SKIP')
|
||||||
|
|
||||||
|
pkgver() {
|
||||||
|
cd "$pkgname"
|
||||||
|
git describe --long --abbrev=7 --tags --match 'v[0-9]*' \
|
||||||
|
| sed 's/^v//; s/\([^-]*-g\)/r\1/; s/-/./g'
|
||||||
|
}
|
||||||
|
|
||||||
|
prepare() {
|
||||||
|
cd "$pkgname/src"
|
||||||
|
|
||||||
|
export RUSTUP_TOOLCHAIN=stable
|
||||||
|
cargo fetch --locked --target "$(rustc -vV | sed -n 's/^host: //p')"
|
||||||
|
}
|
||||||
|
|
||||||
|
build() {
|
||||||
|
cd "$pkgname/src"
|
||||||
|
|
||||||
|
export RUSTUP_TOOLCHAIN=stable
|
||||||
|
export CARGO_TARGET_DIR=target
|
||||||
|
# ort, the ONNX Runtime binding behind the cutout models, downloads a
|
||||||
|
# prebuilt runtime from its build script unless it is pointed at one. Arch
|
||||||
|
# has the library, so it is linked against that instead - dynamically, so
|
||||||
|
# the package follows onnxruntime's updates rather than freezing a copy.
|
||||||
|
# Upstream's flake.nix does the same with nixpkgs' onnxruntime.
|
||||||
|
export ORT_LIB_LOCATION=/usr/lib
|
||||||
|
export ORT_PREFER_DYNAMIC_LINK=1
|
||||||
|
# and if that ever stops being picked up, fail the build instead of
|
||||||
|
# quietly falling back to the download
|
||||||
|
export ORT_SKIP_DOWNLOAD=1
|
||||||
|
# ggml (whisper.cpp's kernels) tunes itself to the machine it is compiled
|
||||||
|
# on unless told otherwise. A package is not always built on the machine it
|
||||||
|
# runs on, and a binary that faults on a CPU without AVX-512 is a bad trade
|
||||||
|
# for kernels nobody measured. Off, it compiles to the portable baseline.
|
||||||
|
export GGML_NATIVE=OFF
|
||||||
|
|
||||||
|
# --profile app: upstream's shipping profile - fat LTO, panic=abort,
|
||||||
|
# stripped. See src/Cargo.toml for what each knob is for.
|
||||||
|
#
|
||||||
|
# Two build scripts download prebuilt static libraries from their own
|
||||||
|
# release pages: sherpa-onnx-sys (text to speech) and skia-bindings (Skia,
|
||||||
|
# the window's renderer; main dropped the FemtoVG-over-wgpu option after
|
||||||
|
# 0.2.4). Their versions move with main, so they are not pinned as sources
|
||||||
|
# here, and build() needs the network.
|
||||||
|
cargo build --profile app -p concat --frozen
|
||||||
|
}
|
||||||
|
|
||||||
|
package() {
|
||||||
|
cd "$pkgname"
|
||||||
|
|
||||||
|
install -Dm755 "src/target/app/concat" "$pkgdir/usr/bin/concat"
|
||||||
|
|
||||||
|
# The desktop entry upstream's release workflow writes into its Linux
|
||||||
|
# packages; there is none in the tree, because the Nix build generates its
|
||||||
|
# own. Reproduced here, with the Exec line pointing at this package's
|
||||||
|
# binary rather than at the /opt folder upstream's .deb installs.
|
||||||
|
install -Dm644 /dev/stdin "$pkgdir/usr/share/applications/concat.desktop" <<'EOF'
|
||||||
|
[Desktop Entry]
|
||||||
|
Type=Application
|
||||||
|
Name=Concat
|
||||||
|
Comment=Video editor
|
||||||
|
Exec=concat %U
|
||||||
|
Icon=concat
|
||||||
|
Categories=AudioVideo;Video;
|
||||||
|
Terminal=false
|
||||||
|
EOF
|
||||||
|
|
||||||
|
install -Dm644 "assets/icons/concat_logo_256.png" \
|
||||||
|
"$pkgdir/usr/share/icons/hicolor/256x256/apps/concat.png"
|
||||||
|
install -Dm644 "assets/concat_logo_512.png" \
|
||||||
|
"$pkgdir/usr/share/icons/hicolor/512x512/apps/concat.png"
|
||||||
|
|
||||||
|
install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
|
||||||
|
install -Dm644 LICENSE-EXCEPTIONS.md \
|
||||||
|
"$pkgdir/usr/share/licenses/$pkgname/LICENSE-EXCEPTIONS.md"
|
||||||
|
install -Dm644 THIRD_PARTY_NOTICES.md \
|
||||||
|
"$pkgdir/usr/share/licenses/$pkgname/THIRD_PARTY_NOTICES.md"
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
# concat-git - Concat (https://github.com/jub0t/Concat) built from the main
|
||||||
|
# branch. Same build as concat, see that package for why the editor needs
|
||||||
|
# cargo, cmake and clang.
|
||||||
|
#
|
||||||
|
# The differences: main dropped the FemtoVG-over-wgpu renderer after 0.2.4,
|
||||||
|
# so this builds upstream's default, Skia. And concat pins the prebuilt
|
||||||
|
# sherpa-onnx static-lib archive as a checksummed source, which it can
|
||||||
|
# because the version comes from a tagged Cargo.lock. Here the versions move
|
||||||
|
# with main, so the build scripts of sherpa-onnx-sys and skia-bindings
|
||||||
|
# download their archives and build() needs the network.
|
||||||
|
#
|
||||||
|
# VCS packages are not version-tracked here on purpose. The AUR copy of a -git
|
||||||
|
# PKGBUILD carries only a snapshot of pkgver; the real version comes from
|
||||||
|
# pkgver() when the user builds it. Following main here would mean AUR pushes
|
||||||
|
# that change nothing for anyone. latest_version() therefore reports the
|
||||||
|
# pkgver that is already in the PKGBUILD, which makes the update run a no-op:
|
||||||
|
# the package is rebuilt, re-checked and pushed only when the packaging
|
||||||
|
# itself changes.
|
||||||
|
#
|
||||||
|
# When that happens, makepkg refreshes the pkgver snapshot in the PKGBUILD as
|
||||||
|
# part of the test build, so the committed snapshot follows along by itself.
|
||||||
|
|
||||||
|
# Installed in CI (pacman) before the makepkg test build.
|
||||||
|
BUILD_DEPS=(rust cmake clang pkgconf git ffmpeg onnxruntime-cpu alsa-lib fontconfig freetype2)
|
||||||
|
|
||||||
|
latest_version() {
|
||||||
|
grep -Po '^pkgver=\K.*' "$(dirname "${BASH_SOURCE[0]}")/PKGBUILD"
|
||||||
|
}
|
||||||
|
|
||||||
|
# refresh_checksums <version> <pkgbuild-path>
|
||||||
|
# Unreachable: latest_version() never reports a version other than the current
|
||||||
|
# one. The git source carries SKIP checksums, so there would be nothing to do.
|
||||||
|
refresh_checksums() {
|
||||||
|
:
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
pkgbase = concat
|
||||||
|
pkgdesc = Free and open-source CapCut replacement, a video editor with a Rust engine
|
||||||
|
pkgver = 0.2.5
|
||||||
|
pkgrel = 1
|
||||||
|
url = https://github.com/jub0t/Concat
|
||||||
|
arch = x86_64
|
||||||
|
license = AGPL-3.0-or-later
|
||||||
|
makedepends = rust
|
||||||
|
makedepends = cmake
|
||||||
|
makedepends = clang
|
||||||
|
makedepends = pkgconf
|
||||||
|
depends = ffmpeg
|
||||||
|
depends = onnxruntime
|
||||||
|
depends = alsa-lib
|
||||||
|
depends = fontconfig
|
||||||
|
depends = freetype2
|
||||||
|
depends = libglvnd
|
||||||
|
depends = vulkan-icd-loader
|
||||||
|
depends = libxkbcommon
|
||||||
|
depends = libxkbcommon-x11
|
||||||
|
depends = libx11
|
||||||
|
depends = libxcursor
|
||||||
|
depends = libxi
|
||||||
|
depends = libxrender
|
||||||
|
depends = wayland
|
||||||
|
depends = dbus
|
||||||
|
depends = gcc-libs
|
||||||
|
depends = glibc
|
||||||
|
depends = hicolor-icon-theme
|
||||||
|
noextract = sherpa-onnx-v1.13.7-linux-x64-static-lib.tar.bz2
|
||||||
|
noextract = skia-binaries-b7f043e0b1e2a850e702-x86_64-unknown-linux-gnu-ganesh-gl-jpegd-jpege-pdf-vulkan.tar.gz
|
||||||
|
options = !debug
|
||||||
|
options = !lto
|
||||||
|
source = concat-0.2.5.tar.gz::https://github.com/jub0t/Concat/archive/refs/tags/v0.2.5.tar.gz
|
||||||
|
source = https://github.com/k2-fsa/sherpa-onnx/releases/download/v1.13.7/sherpa-onnx-v1.13.7-linux-x64-static-lib.tar.bz2
|
||||||
|
source = https://github.com/rust-skia/skia-binaries/releases/download/0.153.3/skia-binaries-b7f043e0b1e2a850e702-x86_64-unknown-linux-gnu-ganesh-gl-jpegd-jpege-pdf-vulkan.tar.gz
|
||||||
|
sha256sums = f77a4e7751f2dc60fa69829434cb2981243736dc98ebd269ba6bd1a75113b9ce
|
||||||
|
sha256sums = d1be7a69ac2b30120058d8302e624239a3064085383cfa47994a14fdc44c32d6
|
||||||
|
sha256sums = 9ebe4c448cc9f789bad241cbd11739cdf759e27db5719c23a7635e096d5807b3
|
||||||
|
|
||||||
|
pkgname = concat
|
||||||
+126
@@ -0,0 +1,126 @@
|
|||||||
|
# Maintainer: Felitendo
|
||||||
|
# This PKGBUILD is updated automatically:
|
||||||
|
# https://git.felo.gg/Felitendo/PKGBUILDS
|
||||||
|
|
||||||
|
pkgname=concat
|
||||||
|
pkgver=0.2.5
|
||||||
|
pkgrel=1
|
||||||
|
pkgdesc="Free and open-source CapCut replacement, a video editor with a Rust engine"
|
||||||
|
arch=('x86_64')
|
||||||
|
url="https://github.com/jub0t/Concat"
|
||||||
|
license=('AGPL-3.0-or-later')
|
||||||
|
# Nothing is spawned at run time: FFmpeg is linked, whisper.cpp, sherpa-onnx
|
||||||
|
# and Skia are compiled in. alsa-lib is cpal's playback backend;
|
||||||
|
# fontconfig and freetype are the font side of the renderer; libglvnd and
|
||||||
|
# vulkan-icd-loader are the two backends Skia and wgpu draw on, and the rest is
|
||||||
|
# what winit opens by name for whichever session the user is in. dbus is the
|
||||||
|
# XDG portal, which is how the file dialogs and "reveal in file manager"
|
||||||
|
# work without a toolkit. onnxruntime runs the cutout models and is linked
|
||||||
|
# dynamically, see ORT_LIB_LOCATION in build().
|
||||||
|
depends=('ffmpeg' 'onnxruntime' 'alsa-lib' 'fontconfig' 'freetype2'
|
||||||
|
'libglvnd' 'vulkan-icd-loader' 'libxkbcommon' 'libxkbcommon-x11'
|
||||||
|
'libx11' 'libxcursor' 'libxi' 'libxrender' 'wayland' 'dbus'
|
||||||
|
'gcc-libs' 'glibc' 'hicolor-icon-theme')
|
||||||
|
# clang: bindgen (FFmpeg headers, whisper.cpp) needs libclang.
|
||||||
|
# cmake: whisper.cpp is compiled in, by its own CMake build.
|
||||||
|
makedepends=('rust' 'cmake' 'clang' 'pkgconf')
|
||||||
|
# !debug: the app profile strips symbols itself, so there is nothing left to
|
||||||
|
# split into a debug package.
|
||||||
|
# !lto: makepkg's lto puts -flto=auto into CFLAGS, and ring - the crypto
|
||||||
|
# behind the model downloads' TLS - compiles hand-written assembly through
|
||||||
|
# cc, which comes out as bitcode and links to nothing. Rust's own LTO is set
|
||||||
|
# in the app profile and is unaffected.
|
||||||
|
options=('!debug' '!lto')
|
||||||
|
# Only tags that start with a version are packaged, and pkgver drops their
|
||||||
|
# hyphens (v0.2.2-alpha.1 -> 0.2.2alpha.1), which pacman sorts older than a
|
||||||
|
# later plain 0.2.2, so no epoch is needed. See pkg.sh.
|
||||||
|
_tag="v0.2.5"
|
||||||
|
# sherpa-onnx-sys (the text-to-speech backend) does not build its C++ side:
|
||||||
|
# it downloads a prebuilt static-lib archive from its own release page unless
|
||||||
|
# it is handed one. Handing it one keeps that binary under makepkg's
|
||||||
|
# checksums instead of arriving unverified from a build script. The version
|
||||||
|
# follows upstream's Cargo.lock and is synced by pkg.sh.
|
||||||
|
_sherpa="1.13.7"
|
||||||
|
# skia-bindings, behind Slint's Skia renderer, is the same: it downloads
|
||||||
|
# prebuilt Skia libraries unless it is handed them. The archive is named by
|
||||||
|
# the crate version and a key (rust-skia commit, target, Skia features). Both
|
||||||
|
# are synced by pkg.sh.
|
||||||
|
_skia="0.153.3"
|
||||||
|
_skia_key="b7f043e0b1e2a850e702-x86_64-unknown-linux-gnu-ganesh-gl-jpegd-jpege-pdf-vulkan"
|
||||||
|
source=("${pkgname}-${pkgver}.tar.gz::https://github.com/jub0t/Concat/archive/refs/tags/${_tag}.tar.gz"
|
||||||
|
"https://github.com/k2-fsa/sherpa-onnx/releases/download/v${_sherpa}/sherpa-onnx-v${_sherpa}-linux-x64-static-lib.tar.bz2"
|
||||||
|
"https://github.com/rust-skia/skia-binaries/releases/download/${_skia}/skia-binaries-${_skia_key}.tar.gz")
|
||||||
|
noextract=("sherpa-onnx-v${_sherpa}-linux-x64-static-lib.tar.bz2"
|
||||||
|
"skia-binaries-${_skia_key}.tar.gz")
|
||||||
|
sha256sums=('f77a4e7751f2dc60fa69829434cb2981243736dc98ebd269ba6bd1a75113b9ce' 'd1be7a69ac2b30120058d8302e624239a3064085383cfa47994a14fdc44c32d6' '9ebe4c448cc9f789bad241cbd11739cdf759e27db5719c23a7635e096d5807b3')
|
||||||
|
|
||||||
|
_srcname="Concat-${_tag#v}"
|
||||||
|
|
||||||
|
prepare() {
|
||||||
|
cd "$_srcname/src"
|
||||||
|
|
||||||
|
export RUSTUP_TOOLCHAIN=stable
|
||||||
|
cargo fetch --locked --target "$(rustc -vV | sed -n 's/^host: //p')"
|
||||||
|
}
|
||||||
|
|
||||||
|
build() {
|
||||||
|
cd "$_srcname/src"
|
||||||
|
|
||||||
|
export RUSTUP_TOOLCHAIN=stable
|
||||||
|
export CARGO_TARGET_DIR=target
|
||||||
|
# the checksummed archive from source[1], instead of a download in build()
|
||||||
|
export SHERPA_ONNX_ARCHIVE_DIR="$srcdir"
|
||||||
|
# the same for source[2]; {key} is filled in by skia-bindings itself
|
||||||
|
export SKIA_BINARIES_URL="file://$srcdir/skia-binaries-{key}.tar.gz"
|
||||||
|
# ort, the ONNX Runtime binding behind the cutout models, downloads a
|
||||||
|
# prebuilt runtime from its build script unless it is pointed at one. Arch
|
||||||
|
# has the library, so it is linked against that instead - dynamically, so
|
||||||
|
# the package follows onnxruntime's updates rather than freezing a copy.
|
||||||
|
# Upstream's flake.nix does the same with nixpkgs' onnxruntime.
|
||||||
|
export ORT_LIB_LOCATION=/usr/lib
|
||||||
|
export ORT_PREFER_DYNAMIC_LINK=1
|
||||||
|
# and if that ever stops being picked up, fail the build instead of
|
||||||
|
# quietly falling back to the download
|
||||||
|
export ORT_SKIP_DOWNLOAD=1
|
||||||
|
# ggml (whisper.cpp's kernels) tunes itself to the machine it is compiled
|
||||||
|
# on unless told otherwise. A package is not always built on the machine it
|
||||||
|
# runs on, and a binary that faults on a CPU without AVX-512 is a bad trade
|
||||||
|
# for kernels nobody measured. Off, it compiles to the portable baseline.
|
||||||
|
export GGML_NATIVE=OFF
|
||||||
|
|
||||||
|
# --profile app: upstream's shipping profile - fat LTO, panic=abort,
|
||||||
|
# stripped. See src/Cargo.toml for what each knob is for.
|
||||||
|
cargo build --profile app -p concat --frozen
|
||||||
|
}
|
||||||
|
|
||||||
|
package() {
|
||||||
|
cd "$_srcname"
|
||||||
|
|
||||||
|
install -Dm755 "src/target/app/concat" "$pkgdir/usr/bin/concat"
|
||||||
|
|
||||||
|
# The desktop entry upstream's release workflow writes into its Linux
|
||||||
|
# packages; there is none in the tree, because the Nix build generates its
|
||||||
|
# own. Reproduced here, with the Exec line pointing at this package's
|
||||||
|
# binary rather than at the /opt folder upstream's .deb installs.
|
||||||
|
install -Dm644 /dev/stdin "$pkgdir/usr/share/applications/concat.desktop" <<'EOF'
|
||||||
|
[Desktop Entry]
|
||||||
|
Type=Application
|
||||||
|
Name=Concat
|
||||||
|
Comment=Video editor
|
||||||
|
Exec=concat %U
|
||||||
|
Icon=concat
|
||||||
|
Categories=AudioVideo;Video;
|
||||||
|
Terminal=false
|
||||||
|
EOF
|
||||||
|
|
||||||
|
install -Dm644 "assets/icons/concat_logo_256.png" \
|
||||||
|
"$pkgdir/usr/share/icons/hicolor/256x256/apps/concat.png"
|
||||||
|
install -Dm644 "assets/concat_logo_512.png" \
|
||||||
|
"$pkgdir/usr/share/icons/hicolor/512x512/apps/concat.png"
|
||||||
|
|
||||||
|
install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
|
||||||
|
install -Dm644 LICENSE-EXCEPTIONS.md \
|
||||||
|
"$pkgdir/usr/share/licenses/$pkgname/LICENSE-EXCEPTIONS.md"
|
||||||
|
install -Dm644 THIRD_PARTY_NOTICES.md \
|
||||||
|
"$pkgdir/usr/share/licenses/$pkgname/THIRD_PARTY_NOTICES.md"
|
||||||
|
}
|
||||||
+126
@@ -0,0 +1,126 @@
|
|||||||
|
# concat - Concat (https://github.com/jub0t/Concat), a free and open-source
|
||||||
|
# CapCut replacement.
|
||||||
|
#
|
||||||
|
# Source package: the PKGBUILD builds the editor from the release tarball -
|
||||||
|
# the same binary upstream ships in the Linux tarball that concat-bin
|
||||||
|
# repackages. Upstream's flake.nix is the reference for what that needs, and
|
||||||
|
# this follows it: cargo, cmake and clang, the system FFmpeg, and Slint's
|
||||||
|
# Skia renderer. (Until 0.2.4 the flake used FemtoVG over wgpu instead; main
|
||||||
|
# dropped that option.)
|
||||||
|
#
|
||||||
|
# Two build scripts download prebuilt static libraries: sherpa-onnx-sys (text
|
||||||
|
# to speech) and skia-bindings (Skia). The PKGBUILD lists both archives as
|
||||||
|
# sources and points the build scripts at them (SHERPA_ONNX_ARCHIVE_DIR,
|
||||||
|
# SKIA_BINARIES_URL), so makepkg checksums them rather than having them
|
||||||
|
# fetched unverified mid-build. Their names follow upstream's Cargo.lock, so
|
||||||
|
# refresh_checksums() reads them from the tarball and syncs _sherpa, _skia
|
||||||
|
# and _skia_key in the PKGBUILD.
|
||||||
|
#
|
||||||
|
# The Skia archive's key is <rust-skia commit>-<target>-<Skia features>. The
|
||||||
|
# commit comes from the skia-bindings crate (.cargo_vcs_info.json). The
|
||||||
|
# features depend on what Slint turns on, which only a cargo build resolves,
|
||||||
|
# so they are taken from upstream's flake.nix, which has to name the same
|
||||||
|
# archive (skiaKeyFeatures). If a flake has none, the PKGBUILD's are kept.
|
||||||
|
#
|
||||||
|
# Release/version handling is identical to concat-bin: the release list is
|
||||||
|
# ordered by creation rather than by version, so the newest is picked by
|
||||||
|
# publication date, only tags that start with a version count, and pkgver
|
||||||
|
# drops the hyphens - see concat-bin/pkg.sh.
|
||||||
|
|
||||||
|
UPSTREAM_REPO="jub0t/Concat"
|
||||||
|
|
||||||
|
# Installed in CI (pacman) before the makepkg test build.
|
||||||
|
BUILD_DEPS=(rust cmake clang pkgconf ffmpeg onnxruntime-cpu alsa-lib fontconfig freetype2)
|
||||||
|
|
||||||
|
latest_tag() {
|
||||||
|
gh api "repos/$UPSTREAM_REPO/releases?per_page=100" \
|
||||||
|
--jq '[.[] | select(.draft | not) | select(.tag_name | test("^v[0-9]"))]
|
||||||
|
| sort_by(.published_at) | last | .tag_name'
|
||||||
|
}
|
||||||
|
|
||||||
|
tag_to_pkgver() {
|
||||||
|
sed 's/^v//; s/-//g'
|
||||||
|
}
|
||||||
|
|
||||||
|
latest_version() {
|
||||||
|
latest_tag | tag_to_pkgver
|
||||||
|
}
|
||||||
|
|
||||||
|
# refresh_checksums <version> <pkgbuild-path>
|
||||||
|
refresh_checksums() {
|
||||||
|
local ver="$1" pkgbuild="$2"
|
||||||
|
local tag tarball lock flake sherpa skia skia_hash skia_features skia_key
|
||||||
|
local sha_src sha_sherpa sha_skia archive
|
||||||
|
|
||||||
|
tag="$(latest_tag)"
|
||||||
|
if [[ "$(tag_to_pkgver <<< "$tag")" != "$ver" ]]; then
|
||||||
|
echo "newest versioned release is $tag, not the requested $ver - try again" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# kept on disk rather than streamed: the tarball is needed for its checksum
|
||||||
|
# and for the Cargo.lock and flake.nix inside it
|
||||||
|
tarball="$(mktemp)"
|
||||||
|
if ! curl -sfL -o "$tarball" \
|
||||||
|
"https://github.com/$UPSTREAM_REPO/archive/refs/tags/$tag.tar.gz"; then
|
||||||
|
rm -f "$tarball"
|
||||||
|
echo "could not download the $tag source tarball" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
sha_src="$(sha256sum "$tarball" | cut -d' ' -f1)"
|
||||||
|
# `|| true`, so that a tree that has moved a file or dropped a crate is
|
||||||
|
# reported below instead of ending the run on a failed exit status with
|
||||||
|
# nothing printed.
|
||||||
|
lock="$(tar -xOzf "$tarball" --wildcards '*/src/Cargo.lock' || true)"
|
||||||
|
flake="$(tar -xOzf "$tarball" --wildcards '*/flake.nix' 2>/dev/null || true)"
|
||||||
|
rm -f "$tarball"
|
||||||
|
|
||||||
|
sherpa="$(grep -A2 '^name = "sherpa-onnx-sys"' <<< "$lock" \
|
||||||
|
| sed -n 's/^version = "\(.*\)"/\1/p' || true)"
|
||||||
|
skia="$(grep -A2 '^name = "skia-bindings"' <<< "$lock" \
|
||||||
|
| sed -n 's/^version = "\(.*\)"/\1/p' || true)"
|
||||||
|
if [[ -z "$sherpa" || -z "$skia" ]]; then
|
||||||
|
echo "could not read the sherpa-onnx-sys and skia-bindings versions from $tag's src/Cargo.lock" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
skia_hash="$(curl -sfL "https://static.crates.io/crates/skia-bindings/skia-bindings-$skia.crate" \
|
||||||
|
| tar -xzO --wildcards '*/.cargo_vcs_info.json' | jq -r '.git.sha1' | cut -c1-20 || true)"
|
||||||
|
if [[ ! "$skia_hash" =~ ^[0-9a-f]{20}$ ]]; then
|
||||||
|
echo "could not read the rust-skia commit of skia-bindings $skia from crates.io" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
skia_features="$(sed -n 's/^ *skiaKeyFeatures = "\(.*\)";/\1/p' <<< "$flake")"
|
||||||
|
if [[ -z "$skia_features" ]]; then
|
||||||
|
skia_features="$(sed -n 's/^_skia_key=".*-x86_64-unknown-linux-gnu-\(.*\)"/\1/p' "$pkgbuild")"
|
||||||
|
fi
|
||||||
|
skia_key="$skia_hash-x86_64-unknown-linux-gnu-$skia_features"
|
||||||
|
|
||||||
|
archive="$(mktemp)"
|
||||||
|
if ! curl -sfL -o "$archive" \
|
||||||
|
"https://github.com/k2-fsa/sherpa-onnx/releases/download/v$sherpa/sherpa-onnx-v$sherpa-linux-x64-static-lib.tar.bz2"; then
|
||||||
|
rm -f "$archive"
|
||||||
|
echo "could not download the sherpa-onnx $sherpa static-lib archive" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
sha_sherpa="$(sha256sum "$archive" | cut -d' ' -f1)"
|
||||||
|
# a missing archive most likely means the features are wrong: check the
|
||||||
|
# "TRYING TO DOWNLOAD AND INSTALL SKIA BINARIES" line of a build log
|
||||||
|
if ! curl -sfL -o "$archive" \
|
||||||
|
"https://github.com/rust-skia/skia-binaries/releases/download/$skia/skia-binaries-$skia_key.tar.gz"; then
|
||||||
|
rm -f "$archive"
|
||||||
|
echo "rust-skia has no Skia archive $skia/$skia_key" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
sha_skia="$(sha256sum "$archive" | cut -d' ' -f1)"
|
||||||
|
rm -f "$archive"
|
||||||
|
|
||||||
|
sed -i \
|
||||||
|
-e "s|^_tag=.*|_tag=\"$tag\"|" \
|
||||||
|
-e "s|^_sherpa=.*|_sherpa=\"$sherpa\"|" \
|
||||||
|
-e "s|^_skia=.*|_skia=\"$skia\"|" \
|
||||||
|
-e "s|^_skia_key=.*|_skia_key=\"$skia_key\"|" \
|
||||||
|
-e "s|^sha256sums=.*|sha256sums=('$sha_src' '$sha_sherpa' '$sha_skia')|" \
|
||||||
|
"$pkgbuild"
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
pkgbase = face-unlock-bin
|
||||||
|
pkgdesc = Face ID for Linux: the lock screen, sudo and admin prompts by face, on Plasma, GNOME, Hyprland and Niri (upstream binary)
|
||||||
|
pkgver = 2.1.0
|
||||||
|
pkgrel = 1
|
||||||
|
url = https://git.felo.gg/LoonixTools/face-unlock
|
||||||
|
install = face-unlock-bin.install
|
||||||
|
arch = x86_64
|
||||||
|
license = GPL-3.0-or-later
|
||||||
|
license = MIT
|
||||||
|
license = Apache-2.0
|
||||||
|
license = BSD-3-Clause
|
||||||
|
license = IJG
|
||||||
|
license = Zlib
|
||||||
|
license = libpng-2.0
|
||||||
|
depends = bash
|
||||||
|
depends = coreutils
|
||||||
|
depends = gawk
|
||||||
|
depends = grep
|
||||||
|
depends = sed
|
||||||
|
depends = gettext
|
||||||
|
depends = systemd
|
||||||
|
depends = systemd-libs
|
||||||
|
depends = pam
|
||||||
|
depends = polkit
|
||||||
|
depends = qt6-base
|
||||||
|
depends = qt6-declarative
|
||||||
|
depends = qt6-wayland
|
||||||
|
depends = wayland
|
||||||
|
depends = layer-shell-qt
|
||||||
|
depends = ki18n
|
||||||
|
depends = glibc
|
||||||
|
depends = libgcc
|
||||||
|
depends = libstdc++
|
||||||
|
depends = hicolor-icon-theme
|
||||||
|
optdepends = hyprpolkitagent: password windows on Hyprland and Niri
|
||||||
|
provides = face-unlock
|
||||||
|
conflicts = face-unlock
|
||||||
|
conflicts = plasma-face-unlock
|
||||||
|
noextract = face-unlock-2.1.0-arch-x86_64.tar.zst
|
||||||
|
options = !debug
|
||||||
|
source = face-unlock-2.1.0-arch-x86_64.tar.zst::https://git.felo.gg/LoonixTools/face-unlock/releases/download/v2.1.0/face-unlock-2.1.0-arch-x86_64.tar.zst
|
||||||
|
sha256sums = b3b48a2c40650cc00ecbde713b86275fe8aef4885ba005c1de6d040974555393
|
||||||
|
|
||||||
|
pkgname = face-unlock-bin
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
# Maintainer: Felitendo
|
||||||
|
# This PKGBUILD is updated automatically:
|
||||||
|
# https://git.felo.gg/Felitendo/PKGBUILDS
|
||||||
|
|
||||||
|
pkgname=face-unlock-bin
|
||||||
|
pkgver=2.1.0
|
||||||
|
pkgrel=1
|
||||||
|
pkgdesc="Face ID for Linux: the lock screen, sudo and admin prompts by face, on Plasma, GNOME, Hyprland and Niri (upstream binary)"
|
||||||
|
arch=('x86_64')
|
||||||
|
url="https://git.felo.gg/LoonixTools/face-unlock"
|
||||||
|
# The program is GPL, the two face networks are MIT (YuNet) and Apache-2.0
|
||||||
|
# (SFace). The daemon has OpenCV (Apache-2.0) linked in, with its copies of
|
||||||
|
# protobuf, libjpeg-turbo, libpng and zlib. All texts are in the package.
|
||||||
|
license=('GPL-3.0-or-later' 'MIT' 'Apache-2.0' 'BSD-3-Clause' 'IJG' 'Zlib' 'libpng-2.0')
|
||||||
|
# What the binaries load, plus what the face-unlock command runs. No opencv:
|
||||||
|
# it is linked in.
|
||||||
|
depends=('bash' 'coreutils' 'gawk' 'grep' 'sed' 'gettext' 'systemd' 'systemd-libs' 'pam' 'polkit'
|
||||||
|
'qt6-base' 'qt6-declarative' 'qt6-wayland' 'wayland' 'layer-shell-qt' 'ki18n'
|
||||||
|
'glibc' 'libgcc' 'libstdc++' 'hicolor-icon-theme')
|
||||||
|
optdepends=('hyprpolkitagent: password windows on Hyprland and Niri')
|
||||||
|
provides=('face-unlock')
|
||||||
|
conflicts=('face-unlock' 'plasma-face-unlock')
|
||||||
|
install="${pkgname}.install"
|
||||||
|
options=('!debug')
|
||||||
|
# Upstream's release workflow builds this tarball on Arch: the make install
|
||||||
|
# tree of face-unlock, in one folder. The agent uses Qt's private API, so it
|
||||||
|
# fits the Qt that Arch had at the release.
|
||||||
|
_tarball="face-unlock-${pkgver}-arch-${CARCH}.tar.zst"
|
||||||
|
source=("${_tarball}::${url}/releases/download/v${pkgver}/${_tarball}")
|
||||||
|
noextract=("${_tarball}")
|
||||||
|
sha256sums=('b3b48a2c40650cc00ecbde713b86275fe8aef4885ba005c1de6d040974555393')
|
||||||
|
|
||||||
|
package() {
|
||||||
|
# extracted here and not by makepkg, so the files keep the root owner
|
||||||
|
# the tarball gives them
|
||||||
|
bsdtar -xpf "$srcdir/${_tarball}" -C "$pkgdir" --strip-components 1
|
||||||
|
mv "$pkgdir/usr/share/licenses/face-unlock" "$pkgdir/usr/share/licenses/$pkgname"
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
post_install() {
|
||||||
|
# Faces, settings and PAM lines of plasma-face-unlock, the old name.
|
||||||
|
face-unlock --root migrate >/dev/null 2>&1 || true
|
||||||
|
cat <<'MSG'
|
||||||
|
|
||||||
|
face-unlock is installed. Run it as your own user, not with sudo:
|
||||||
|
|
||||||
|
face-unlock interactive menu
|
||||||
|
face-unlock enable set up your face and turn it on
|
||||||
|
|
||||||
|
It asks for your password when it needs to. sudo and admin prompts stay
|
||||||
|
with the password until you switch them on under Settings.
|
||||||
|
|
||||||
|
MSG
|
||||||
|
}
|
||||||
|
|
||||||
|
post_upgrade() {
|
||||||
|
face-unlock --root migrate >/dev/null 2>&1 || true
|
||||||
|
}
|
||||||
|
|
||||||
|
pre_remove() {
|
||||||
|
cat <<'MSG'
|
||||||
|
|
||||||
|
Before removing this package, run
|
||||||
|
|
||||||
|
face-unlock disable
|
||||||
|
|
||||||
|
as each user that turned it on. That takes face unlock back out of sudo,
|
||||||
|
polkit and the lock screens. (Removing it without that is safe too: the PAM
|
||||||
|
line is written so that a missing module is skipped.)
|
||||||
|
|
||||||
|
MSG
|
||||||
|
systemctl disable --now face-unlockd.socket face-unlockd.service >/dev/null 2>&1 || true
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
# face-unlock-bin - the Arch build of face-unlock
|
||||||
|
# (https://git.felo.gg/LoonixTools/face-unlock), made by upstream's release
|
||||||
|
# workflow: the same program as the face-unlock package, with OpenCV linked in
|
||||||
|
# statically, so an OpenCV update on Arch does not break it.
|
||||||
|
#
|
||||||
|
# Not every release has the tarball (2.0.0 and older do not), so the newest
|
||||||
|
# release that has it is tracked, not /releases/latest. Gitea keeps no digest
|
||||||
|
# for release assets, so the checksum comes from downloading the tarball.
|
||||||
|
|
||||||
|
UPSTREAM_REPO="LoonixTools/face-unlock"
|
||||||
|
|
||||||
|
# newest published release with an Arch tarball, as its tag
|
||||||
|
latest_tag() {
|
||||||
|
curl -sf "https://git.felo.gg/api/v1/repos/$UPSTREAM_REPO/releases?limit=30" \
|
||||||
|
| jq -r '[.[] | select((.draft or .prerelease) | not)
|
||||||
|
| select(any(.assets[]; .name | endswith("-arch-x86_64.tar.zst")))]
|
||||||
|
| first | .tag_name // empty'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Kept off the AUR until a release has the tarball: until then the PKGBUILD
|
||||||
|
# has nothing to point at. The run that finds the first one updates the
|
||||||
|
# PKGBUILD and test-builds it before anything is pushed.
|
||||||
|
AUR_PUBLISH=false
|
||||||
|
if [[ -n "$(latest_tag)" ]]; then
|
||||||
|
AUR_PUBLISH=true
|
||||||
|
fi
|
||||||
|
|
||||||
|
latest_version() {
|
||||||
|
local tag
|
||||||
|
tag="$(latest_tag)"
|
||||||
|
[[ -n "$tag" ]] || return 75
|
||||||
|
echo "${tag#v}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# refresh_checksums <version> <pkgbuild-path>
|
||||||
|
refresh_checksums() {
|
||||||
|
local ver="$1" pkgbuild="$2"
|
||||||
|
local name="face-unlock-$ver-arch-x86_64.tar.zst" sha
|
||||||
|
|
||||||
|
sha="$(curl -sfL "https://git.felo.gg/$UPSTREAM_REPO/releases/download/v$ver/$name" \
|
||||||
|
| sha256sum | cut -d' ' -f1)"
|
||||||
|
|
||||||
|
sed -i "s|^sha256sums=.*|sha256sums=('$sha')|" "$pkgbuild"
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
pkgbase = face-unlock
|
||||||
|
pkgdesc = Face ID for Linux: the lock screen, sudo and admin prompts by face, on Plasma, GNOME, Hyprland and Niri
|
||||||
|
pkgver = 2.1.0
|
||||||
|
pkgrel = 1
|
||||||
|
url = https://git.felo.gg/LoonixTools/face-unlock
|
||||||
|
install = face-unlock.install
|
||||||
|
arch = x86_64
|
||||||
|
arch = aarch64
|
||||||
|
license = GPL-3.0-or-later
|
||||||
|
license = MIT
|
||||||
|
license = Apache-2.0
|
||||||
|
makedepends = cmake
|
||||||
|
makedepends = scdoc
|
||||||
|
depends = bash
|
||||||
|
depends = coreutils
|
||||||
|
depends = gawk
|
||||||
|
depends = grep
|
||||||
|
depends = sed
|
||||||
|
depends = gettext
|
||||||
|
depends = systemd
|
||||||
|
depends = systemd-libs
|
||||||
|
depends = pam
|
||||||
|
depends = polkit
|
||||||
|
depends = opencv
|
||||||
|
depends = qt6-base
|
||||||
|
depends = qt6-declarative
|
||||||
|
depends = layer-shell-qt
|
||||||
|
depends = ki18n
|
||||||
|
optdepends = hyprpolkitagent: password windows on Hyprland and Niri
|
||||||
|
conflicts = plasma-face-unlock
|
||||||
|
replaces = plasma-face-unlock
|
||||||
|
noextract = face_detection_yunet_2023mar.onnx
|
||||||
|
noextract = face_recognition_sface_2021dec.onnx
|
||||||
|
source = face-unlock-2.1.0.tar.gz::https://git.felo.gg/LoonixTools/face-unlock/archive/v2.1.0.tar.gz
|
||||||
|
source = face_detection_yunet_2023mar.onnx::https://github.com/opencv/opencv_zoo/raw/main/models/face_detection_yunet/face_detection_yunet_2023mar.onnx
|
||||||
|
source = face_recognition_sface_2021dec.onnx::https://github.com/opencv/opencv_zoo/raw/main/models/face_recognition_sface/face_recognition_sface_2021dec.onnx
|
||||||
|
sha256sums = 35ab950c775c92706bd1ea7e5b8abfa99dea7635f8e971dabd80ed6a1afc1270
|
||||||
|
sha256sums = 8f2383e4dd3cfbb4553ea8718107fc0423210dc964f9f4280604804ed2552fa4
|
||||||
|
sha256sums = 0ba9fbfa01b5270c96627c4ef784da859931e02f04419c829e83484087c34e79
|
||||||
|
|
||||||
|
pkgname = face-unlock
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
# Maintainer: Felitendo
|
||||||
|
# This PKGBUILD is updated automatically:
|
||||||
|
# https://git.felo.gg/Felitendo/PKGBUILDS
|
||||||
|
|
||||||
|
pkgname=face-unlock
|
||||||
|
pkgver=2.1.0
|
||||||
|
pkgrel=1
|
||||||
|
pkgdesc="Face ID for Linux: the lock screen, sudo and admin prompts by face, on Plasma, GNOME, Hyprland and Niri"
|
||||||
|
arch=('x86_64' 'aarch64')
|
||||||
|
url="https://git.felo.gg/LoonixTools/face-unlock"
|
||||||
|
license=('GPL-3.0-or-later' 'MIT' 'Apache-2.0')
|
||||||
|
depends=('bash' 'coreutils' 'gawk' 'grep' 'sed' 'gettext' 'systemd' 'systemd-libs' 'pam' 'polkit'
|
||||||
|
'opencv' 'qt6-base' 'qt6-declarative' 'layer-shell-qt' 'ki18n')
|
||||||
|
makedepends=('cmake' 'scdoc')
|
||||||
|
optdepends=('hyprpolkitagent: password windows on Hyprland and Niri')
|
||||||
|
# The old name.
|
||||||
|
replaces=('plasma-face-unlock')
|
||||||
|
conflicts=('plasma-face-unlock')
|
||||||
|
install="${pkgname}.install"
|
||||||
|
# The two face networks come from the OpenCV model zoo, pinned by checksum.
|
||||||
|
source=("${pkgname}-${pkgver}.tar.gz::${url}/archive/v${pkgver}.tar.gz"
|
||||||
|
"face_detection_yunet_2023mar.onnx::https://github.com/opencv/opencv_zoo/raw/main/models/face_detection_yunet/face_detection_yunet_2023mar.onnx"
|
||||||
|
"face_recognition_sface_2021dec.onnx::https://github.com/opencv/opencv_zoo/raw/main/models/face_recognition_sface/face_recognition_sface_2021dec.onnx")
|
||||||
|
noextract=('face_detection_yunet_2023mar.onnx' 'face_recognition_sface_2021dec.onnx')
|
||||||
|
sha256sums=('35ab950c775c92706bd1ea7e5b8abfa99dea7635f8e971dabd80ed6a1afc1270' '8f2383e4dd3cfbb4553ea8718107fc0423210dc964f9f4280604804ed2552fa4' '0ba9fbfa01b5270c96627c4ef784da859931e02f04419c829e83484087c34e79')
|
||||||
|
|
||||||
|
build() {
|
||||||
|
make -C "${pkgname}" VERSION="$pkgver"
|
||||||
|
}
|
||||||
|
|
||||||
|
check() {
|
||||||
|
make -C "${pkgname}" VERSION="$pkgver" test
|
||||||
|
}
|
||||||
|
|
||||||
|
package() {
|
||||||
|
make -C "${pkgname}" VERSION="$pkgver" MODELS_SRC="$srcdir" DESTDIR="$pkgdir" install
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
post_install() {
|
||||||
|
# Faces, settings and PAM lines of plasma-face-unlock, the old name.
|
||||||
|
face-unlock --root migrate >/dev/null 2>&1 || true
|
||||||
|
cat <<'MSG'
|
||||||
|
|
||||||
|
face-unlock is installed. Run it as your own user, not with sudo:
|
||||||
|
|
||||||
|
face-unlock interactive menu
|
||||||
|
face-unlock enable set up your face and turn it on
|
||||||
|
|
||||||
|
It asks for your password when it needs to. sudo and admin prompts stay
|
||||||
|
with the password until you switch them on under Settings.
|
||||||
|
|
||||||
|
MSG
|
||||||
|
}
|
||||||
|
|
||||||
|
post_upgrade() {
|
||||||
|
face-unlock --root migrate >/dev/null 2>&1 || true
|
||||||
|
}
|
||||||
|
|
||||||
|
pre_remove() {
|
||||||
|
cat <<'MSG'
|
||||||
|
|
||||||
|
Before removing this package, run
|
||||||
|
|
||||||
|
face-unlock disable
|
||||||
|
|
||||||
|
as each user that turned it on. That takes face unlock back out of sudo,
|
||||||
|
polkit and the lock screens. (Removing it without that is safe too: the PAM
|
||||||
|
line is written so that a missing module is skipped.)
|
||||||
|
|
||||||
|
MSG
|
||||||
|
systemctl disable --now face-unlockd.socket face-unlockd.service >/dev/null 2>&1 || true
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
# face-unlock - Face ID for Linux: Plasma, GNOME, Hyprland and Niri
|
||||||
|
# (https://git.felo.gg/LoonixTools/face-unlock). Called plasma-face-unlock
|
||||||
|
# before 2.0.0.
|
||||||
|
#
|
||||||
|
# Built from the release tarball with the upstream Makefile (CMake for the
|
||||||
|
# daemon, the agent and the PAM module). The two face networks are sources of
|
||||||
|
# their own from the OpenCV model zoo with fixed checksums, so a release only
|
||||||
|
# changes the tarball's.
|
||||||
|
|
||||||
|
UPSTREAM_REPO="LoonixTools/face-unlock"
|
||||||
|
|
||||||
|
# Installed in CI (pacman) before the makepkg test build, which skips the
|
||||||
|
# dependency check. check() runs the upstream tests and needs nothing more.
|
||||||
|
BUILD_DEPS=(cmake scdoc gettext opencv qt6-base qt6-declarative layer-shell-qt ki18n pam systemd-libs)
|
||||||
|
|
||||||
|
latest_version() {
|
||||||
|
# the highest vX.Y.Z tag; not every release has a release page
|
||||||
|
curl -sf "https://git.felo.gg/api/v1/repos/$UPSTREAM_REPO/tags?limit=50" \
|
||||||
|
| jq -r '.[].name | select(test("^v[0-9]+(\\.[0-9]+)*$"))' \
|
||||||
|
| sed 's/^v//' | sort -V | tail -n 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# refresh_checksums <version> <pkgbuild-path>
|
||||||
|
refresh_checksums() {
|
||||||
|
local ver="$1" pkgbuild="$2"
|
||||||
|
local sha
|
||||||
|
sha="$(curl -sfL \
|
||||||
|
"https://git.felo.gg/$UPSTREAM_REPO/archive/v$ver.tar.gz" \
|
||||||
|
| sha256sum | cut -d' ' -f1)"
|
||||||
|
# Only the first sum is the tarball's; the models' stay.
|
||||||
|
sed -i -E "s|^sha256sums=\('[^']*'|sha256sums=('$sha'|" "$pkgbuild"
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
pkgbase = faugus-launcher-bin
|
pkgbase = faugus-launcher-bin
|
||||||
pkgdesc = Simple and lightweight app for running Windows games using UMU-Launcher (prebuilt)
|
pkgdesc = Simple and lightweight app for running Windows games using UMU-Launcher (upstream binary)
|
||||||
pkgver = 2.0.2
|
pkgver = 2.4.2
|
||||||
pkgrel = 1
|
pkgrel = 1
|
||||||
url = https://github.com/Faugus/faugus-launcher
|
url = https://github.com/Faugus/faugus-launcher
|
||||||
arch = any
|
arch = any
|
||||||
@@ -21,7 +21,8 @@ pkgbase = faugus-launcher-bin
|
|||||||
optdepends = gamemode: feral gamemode integration
|
optdepends = gamemode: feral gamemode integration
|
||||||
provides = faugus-launcher
|
provides = faugus-launcher
|
||||||
conflicts = faugus-launcher
|
conflicts = faugus-launcher
|
||||||
source = faugus-launcher-bin-2.0.2-1.tar.zst::https://github.com/Felitendo/PKGBUILDS/releases/download/faugus-launcher-bin-2.0.2/faugus-launcher-bin-2.0.2.tar.zst
|
noextract = faugus-launcher-bin-2.4.2.deb
|
||||||
sha256sums = 5fcf441cccb1ccc0ac554760e93744d557fd05a3fc4335132a59e55aefe902af
|
source = faugus-launcher-bin-2.4.2.deb::https://github.com/Faugus/faugus-launcher/releases/download/2.4.2/faugus-launcher_2.4.2-1_all.deb
|
||||||
|
sha256sums = 06d41869f42c2078a36a366b38ee62b7aa6dc98e08bb4a1346d7eb193ff8f145
|
||||||
|
|
||||||
pkgname = faugus-launcher-bin
|
pkgname = faugus-launcher-bin
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
# Maintainer: Felitendo
|
# Maintainer: Felitendo
|
||||||
# This PKGBUILD is updated automatically:
|
# This PKGBUILD is updated automatically:
|
||||||
# https://github.com/Felitendo/PKGBUILDS
|
# https://git.felo.gg/Felitendo/PKGBUILDS
|
||||||
|
|
||||||
pkgname=faugus-launcher-bin
|
pkgname=faugus-launcher-bin
|
||||||
pkgver=2.0.2
|
pkgver=2.4.2
|
||||||
pkgrel=1
|
pkgrel=1
|
||||||
pkgdesc="Simple and lightweight app for running Windows games using UMU-Launcher (prebuilt)"
|
pkgdesc="Simple and lightweight app for running Windows games using UMU-Launcher (upstream binary)"
|
||||||
arch=('any')
|
arch=('any')
|
||||||
url="https://github.com/Faugus/faugus-launcher"
|
url="https://github.com/Faugus/faugus-launcher"
|
||||||
license=('MIT')
|
license=('MIT')
|
||||||
@@ -16,9 +16,51 @@ optdepends=('mangohud: performance overlay'
|
|||||||
'gamemode: feral gamemode integration')
|
'gamemode: feral gamemode integration')
|
||||||
provides=('faugus-launcher')
|
provides=('faugus-launcher')
|
||||||
conflicts=('faugus-launcher')
|
conflicts=('faugus-launcher')
|
||||||
source=("${pkgname}-${pkgver}-${pkgrel}.tar.zst::https://github.com/Felitendo/PKGBUILDS/releases/download/${pkgname}-${pkgver}/${pkgname}-${pkgver}.tar.zst")
|
# The Debian revision in the asset name does not follow from pkgver, so the
|
||||||
sha256sums=('5fcf441cccb1ccc0ac554760e93744d557fd05a3fc4335132a59e55aefe902af')
|
# exact name is tracked here and refreshed automatically.
|
||||||
|
_asset="faugus-launcher_2.4.2-1_all.deb"
|
||||||
|
source=("${pkgname}-${pkgver}.deb::${url}/releases/download/${pkgver}/${_asset}")
|
||||||
|
noextract=("${pkgname}-${pkgver}.deb")
|
||||||
|
sha256sums=('06d41869f42c2078a36a366b38ee62b7aa6dc98e08bb4a1346d7eb193ff8f145')
|
||||||
|
|
||||||
package() {
|
package() {
|
||||||
cp -a "$srcdir/usr" "$pkgdir/"
|
local _deb="$srcdir/deb"
|
||||||
|
|
||||||
|
install -d "$_deb"
|
||||||
|
bsdtar -xOf "$srcdir/${pkgname}-${pkgver}.deb" 'data.tar.*' \
|
||||||
|
| bsdtar -xpf - -C "$_deb" ./usr
|
||||||
|
|
||||||
|
# Debian puts the modules in dist-packages, which is not on Arch's
|
||||||
|
# sys.path. A fixed private directory also keeps the package working
|
||||||
|
# across Python minor bumps, since it is only rebuilt for new releases.
|
||||||
|
install -d "$pkgdir/usr/lib/faugus-launcher"
|
||||||
|
cp -a "$_deb/usr/lib/python3/dist-packages/faugus" "$pkgdir/usr/lib/faugus-launcher/"
|
||||||
|
# .pyc compiled for Debian's Python, useless here
|
||||||
|
find "$pkgdir/usr/lib/faugus-launcher" -type d -name __pycache__ -exec rm -rf {} +
|
||||||
|
|
||||||
|
cp -a "$_deb/usr/share" "$pkgdir/usr/"
|
||||||
|
# generated by pacman hooks; shipping them would cause file conflicts
|
||||||
|
rm -f "$pkgdir/usr/share/applications/mimeinfo.cache" \
|
||||||
|
"$pkgdir/usr/share/icons/hicolor/icon-theme.cache"
|
||||||
|
|
||||||
|
# upstream's wrapper relies on Debian's default sys.path, ours points at
|
||||||
|
# the directory above; the rest matches upstream verbatim
|
||||||
|
install -d "$pkgdir/usr/bin"
|
||||||
|
cat > "$pkgdir/usr/bin/faugus-launcher" << 'EOF'
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
export PYTHONPATH="/usr/lib/faugus-launcher${PYTHONPATH:+:$PYTHONPATH}"
|
||||||
|
export GTK_IM_MODULE="${GTK_IM_MODULE:-simple}"
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
--shortcut) exec /usr/bin/python3 -m faugus.shortcut "$2";;
|
||||||
|
--game) exec /usr/bin/python3 -m faugus.runner --game "$2";;
|
||||||
|
--run) msg="$2"; shift 2; exec /usr/bin/python3 -m faugus.runner "$msg" "$@";;
|
||||||
|
*) exec /usr/bin/python3 -m faugus.launcher "$@";;
|
||||||
|
esac
|
||||||
|
EOF
|
||||||
|
chmod 755 "$pkgdir/usr/bin/faugus-launcher"
|
||||||
|
|
||||||
|
mv "$pkgdir/usr/share/licenses/faugus-launcher" \
|
||||||
|
"$pkgdir/usr/share/licenses/$pkgname"
|
||||||
}
|
}
|
||||||
+22
-42
@@ -1,54 +1,34 @@
|
|||||||
# faugus-launcher-bin - prebuilt package of https://github.com/Faugus/faugus-launcher
|
# faugus-launcher-bin - Faugus Launcher
|
||||||
# (GTK4 game launcher for running Windows games through UMU-Launcher, Python).
|
# (https://github.com/Faugus/faugus-launcher), a GTK4 front-end for running
|
||||||
|
# Windows games through UMU-Launcher.
|
||||||
#
|
#
|
||||||
# Upstream ships AppImage/deb/rpm but no Arch-friendly binary, so
|
# Upstream publishes an architecture-independent .deb per release, which the
|
||||||
# build_artifact() builds the meson project from the release tarball.
|
# PKGBUILD repackages. The Debian revision in the asset name is not derived
|
||||||
|
# from the version, so refresh_checksums() resolves the asset via the GitHub
|
||||||
|
# API and syncs the _asset variable in the PKGBUILD along with the checksum.
|
||||||
|
#
|
||||||
|
# Upstream tags carry no "v" prefix.
|
||||||
|
|
||||||
UPSTREAM_REPO="Faugus/faugus-launcher"
|
UPSTREAM_REPO="Faugus/faugus-launcher"
|
||||||
|
|
||||||
# Installed in CI (pacman) before build_artifact runs.
|
|
||||||
# (Translations ship as prebuilt .mo files, so no gettext needed.)
|
|
||||||
BUILD_DEPS=(meson ninja python)
|
|
||||||
|
|
||||||
latest_version() {
|
latest_version() {
|
||||||
gh api "repos/$UPSTREAM_REPO/releases/latest" --jq '.tag_name' | sed 's/^v//'
|
gh api "repos/$UPSTREAM_REPO/releases/latest" --jq '.tag_name' | sed 's/^v//'
|
||||||
}
|
}
|
||||||
|
|
||||||
# build_artifact <version> <output-file>
|
# refresh_checksums <version> <pkgbuild-path>
|
||||||
build_artifact() {
|
refresh_checksums() {
|
||||||
local ver="$1" outfile="$2"
|
local ver="$1" pkgbuild="$2"
|
||||||
local workdir destdir srctree sitedir
|
local asset sha
|
||||||
workdir="$(mktemp -d)"
|
|
||||||
destdir="$(mktemp -d)"
|
|
||||||
|
|
||||||
curl -sfL "https://github.com/$UPSTREAM_REPO/archive/refs/tags/$ver.tar.gz" | tar -xz -C "$workdir"
|
asset="$(gh api "repos/$UPSTREAM_REPO/releases/tags/$ver" --jq '.assets[].name' \
|
||||||
srctree="$workdir/faugus-launcher-$ver"
|
| grep -E "^faugus-launcher_${ver}-[0-9]+_all\.deb$")"
|
||||||
|
[[ "$(wc -l <<< "$asset")" -eq 1 ]] || { echo "expected exactly one deb, got: $asset" >&2; return 1; }
|
||||||
|
|
||||||
meson setup "$workdir/build" "$srctree" --prefix=/usr --buildtype=release
|
sha="$(curl -sfL "https://github.com/$UPSTREAM_REPO/releases/download/$ver/$asset" \
|
||||||
meson install -C "$workdir/build" --destdir "$destdir"
|
| sha256sum | cut -d' ' -f1)"
|
||||||
|
|
||||||
# meson installs the python modules into site-packages, whose path changes
|
sed -i \
|
||||||
# with every Python minor bump and would silently break a prebuilt package.
|
-e "s|^_asset=.*|_asset=\"$asset\"|" \
|
||||||
# Relocate to a fixed dir and put it on the launcher's PYTHONPATH (the
|
-e "s|^sha256sums=.*|sha256sums=('$sha')|" \
|
||||||
# launcher script already appends any pre-set PYTHONPATH to its own).
|
"$pkgbuild"
|
||||||
sitedir="$(find "$destdir/usr/lib" -maxdepth 2 -type d -name site-packages)"
|
|
||||||
[[ -d "$sitedir/faugus" ]] || { echo "faugus module not found in $sitedir" >&2; return 1; }
|
|
||||||
mkdir -p "$destdir/usr/lib/faugus-launcher"
|
|
||||||
mv "$sitedir/faugus" "$destdir/usr/lib/faugus-launcher/"
|
|
||||||
rm -rf "$destdir/usr/lib/python"*
|
|
||||||
|
|
||||||
head -1 "$destdir/usr/bin/faugus-launcher" | grep -qx '#!/bin/sh' \
|
|
||||||
|| { echo "unexpected launcher script format" >&2; return 1; }
|
|
||||||
sed -i '1a export PYTHONPATH="/usr/lib/faugus-launcher${PYTHONPATH:+:$PYTHONPATH}"' \
|
|
||||||
"$destdir/usr/bin/faugus-launcher"
|
|
||||||
|
|
||||||
# These caches are generated by pacman hooks; shipping them would cause
|
|
||||||
# file conflicts on install.
|
|
||||||
rm -f "$destdir/usr/share/applications/mimeinfo.cache" \
|
|
||||||
"$destdir/usr/share/icons/hicolor/icon-theme.cache"
|
|
||||||
|
|
||||||
tar --zstd --sort=name --owner=0 --group=0 --numeric-owner --mtime='@0' \
|
|
||||||
-cf "$outfile" -C "$destdir" usr
|
|
||||||
|
|
||||||
rm -rf "$workdir" "$destdir"
|
|
||||||
}
|
}
|
||||||
+7
-5
@@ -1,6 +1,6 @@
|
|||||||
pkgbase = fluxer-bin
|
pkgbase = fluxer-bin
|
||||||
pkgdesc = Fluxer Desktop Application
|
pkgdesc = Fluxer Desktop Application
|
||||||
pkgver = 0.0.8
|
pkgver = 2026.1004.13532
|
||||||
pkgrel = 1
|
pkgrel = 1
|
||||||
url = https://fluxer.app
|
url = https://fluxer.app
|
||||||
arch = x86_64
|
arch = x86_64
|
||||||
@@ -9,12 +9,14 @@ pkgbase = fluxer-bin
|
|||||||
depends = gtk3
|
depends = gtk3
|
||||||
depends = nss
|
depends = nss
|
||||||
depends = alsa-lib
|
depends = alsa-lib
|
||||||
|
provides = fluxer
|
||||||
|
conflicts = fluxer
|
||||||
options = !strip
|
options = !strip
|
||||||
source = fluxer.desktop
|
source = fluxer.desktop
|
||||||
sha256sums = 981daa8015b823fef254bb8e79fe6b28f77dda02cdc374796443bd64f5041de1
|
sha256sums = 981daa8015b823fef254bb8e79fe6b28f77dda02cdc374796443bd64f5041de1
|
||||||
source_x86_64 = fluxer-0.0.8-x64.tar.gz::https://api.fluxer.app/dl/desktop/stable/linux/x64/0.0.8/tar_gz
|
source_x86_64 = fluxer-2026.1004.13532-x64.tar.gz::https://api.fluxer.app/dl/desktop/stable/linux/x64/2026.1004.13532/tar_gz
|
||||||
sha256sums_x86_64 = acf6398fa6810720fed85b06c011b324e7db4fec6bf2fc7ad93c2446c3600f2d
|
sha256sums_x86_64 = 976ff888bdb78808ebb6b1d4cc68fd41e020ef95a37e6948d6cd561622875e9e
|
||||||
source_aarch64 = fluxer-0.0.8-arm64.tar.gz::https://api.fluxer.app/dl/desktop/stable/linux/arm64/0.0.8/tar_gz
|
source_aarch64 = fluxer-2026.1004.13532-arm64.tar.gz::https://api.fluxer.app/dl/desktop/stable/linux/arm64/2026.1004.13532/tar_gz
|
||||||
sha256sums_aarch64 = 77b874a98caf48de5bc4ccf03119f45262fe26fd7be085b57d7b40b1505d0ec8
|
sha256sums_aarch64 = cf61c60506fb3a9f9b389af27407cf893eb3133707a8caa8a0ef55902d629a4a
|
||||||
|
|
||||||
pkgname = fluxer-bin
|
pkgname = fluxer-bin
|
||||||
+30
-9
@@ -1,32 +1,39 @@
|
|||||||
# Maintainer: Felitendo
|
# Maintainer: Felitendo
|
||||||
# Contributor: Cosmo <cptncosmo@gmail.com>
|
# Contributor: Cosmo <cptncosmo@gmail.com>
|
||||||
# This PKGBUILD is updated automatically:
|
# This PKGBUILD is updated automatically:
|
||||||
# https://github.com/Felitendo/PKGBUILDS
|
# https://git.felo.gg/Felitendo/PKGBUILDS
|
||||||
|
|
||||||
pkgname=fluxer-bin
|
pkgname=fluxer-bin
|
||||||
pkgver=0.0.8
|
# Upstream versions are date-based: this is the build of 2026-09-20 at
|
||||||
|
# 04:13:03 UTC. They sort above the 0.0.x scheme the package used before.
|
||||||
|
pkgver=2026.1004.13532
|
||||||
pkgrel=1
|
pkgrel=1
|
||||||
pkgdesc="Fluxer Desktop Application"
|
pkgdesc="Fluxer Desktop Application"
|
||||||
arch=('x86_64' 'aarch64')
|
arch=('x86_64' 'aarch64')
|
||||||
url="https://fluxer.app"
|
url="https://fluxer.app"
|
||||||
license=('AGPL-3.0-only')
|
license=('AGPL-3.0-only')
|
||||||
depends=('gtk3' 'nss' 'alsa-lib')
|
depends=('gtk3' 'nss' 'alsa-lib')
|
||||||
|
# /usr/bin/fluxer is also installed by fluxer-git on the AUR and by the
|
||||||
|
# "fluxer" package in upstream's own pacman repository:
|
||||||
|
# provides/conflicts makes that an either/or instead of a file conflict
|
||||||
|
provides=('fluxer')
|
||||||
|
conflicts=('fluxer')
|
||||||
options=('!strip')
|
options=('!strip')
|
||||||
|
|
||||||
source=("fluxer.desktop")
|
source=("fluxer.desktop")
|
||||||
sha256sums=('981daa8015b823fef254bb8e79fe6b28f77dda02cdc374796443bd64f5041de1')
|
sha256sums=('981daa8015b823fef254bb8e79fe6b28f77dda02cdc374796443bd64f5041de1')
|
||||||
|
|
||||||
source_x86_64=("fluxer-${pkgver}-x64.tar.gz::https://api.fluxer.app/dl/desktop/stable/linux/x64/${pkgver}/tar_gz")
|
source_x86_64=("fluxer-${pkgver}-x64.tar.gz::https://api.fluxer.app/dl/desktop/stable/linux/x64/${pkgver}/tar_gz")
|
||||||
sha256sums_x86_64=('acf6398fa6810720fed85b06c011b324e7db4fec6bf2fc7ad93c2446c3600f2d')
|
sha256sums_x86_64=('976ff888bdb78808ebb6b1d4cc68fd41e020ef95a37e6948d6cd561622875e9e')
|
||||||
|
|
||||||
source_aarch64=("fluxer-${pkgver}-arm64.tar.gz::https://api.fluxer.app/dl/desktop/stable/linux/arm64/${pkgver}/tar_gz")
|
source_aarch64=("fluxer-${pkgver}-arm64.tar.gz::https://api.fluxer.app/dl/desktop/stable/linux/arm64/${pkgver}/tar_gz")
|
||||||
sha256sums_aarch64=('77b874a98caf48de5bc4ccf03119f45262fe26fd7be085b57d7b40b1505d0ec8')
|
sha256sums_aarch64=('cf61c60506fb3a9f9b389af27407cf893eb3133707a8caa8a0ef55902d629a4a')
|
||||||
|
|
||||||
package() {
|
package() {
|
||||||
local _dir
|
local _dir
|
||||||
case "$CARCH" in
|
case "$CARCH" in
|
||||||
x86_64) _dir="fluxer-stable-${pkgver}-x64" ;;
|
x86_64) _dir="Fluxer-${pkgver}-linux-x64" ;;
|
||||||
aarch64) _dir="fluxer-stable-${pkgver}-arm64" ;;
|
aarch64) _dir="Fluxer-${pkgver}-linux-arm64" ;;
|
||||||
esac
|
esac
|
||||||
# upstream has changed the archive layout before - fall back to a glob
|
# upstream has changed the archive layout before - fall back to a glob
|
||||||
if [ ! -d "$srcdir/$_dir" ]; then
|
if [ ! -d "$srcdir/$_dir" ]; then
|
||||||
@@ -47,8 +54,22 @@ package() {
|
|||||||
|
|
||||||
install -Dm644 "$srcdir/fluxer.desktop" "$pkgdir/usr/share/applications/fluxer.desktop"
|
install -Dm644 "$srcdir/fluxer.desktop" "$pkgdir/usr/share/applications/fluxer.desktop"
|
||||||
|
|
||||||
if [ -f "$pkgdir/opt/$pkgname/resources/512x512.png" ]; then
|
# The bundle carries a full icon set, named after the size it holds.
|
||||||
install -Dm644 "$pkgdir/opt/$pkgname/resources/512x512.png" \
|
# The glob takes those and leaves icon.png and the tray templates, which
|
||||||
"$pkgdir/usr/share/icons/hicolor/512x512/apps/fluxer.png"
|
# carry no size, alone.
|
||||||
|
local _icon _size _found=0
|
||||||
|
for _icon in "$srcdir/$_dir"/resources/icons/[0-9]*x[0-9]*.png; do
|
||||||
|
[ -f "$_icon" ] || continue
|
||||||
|
_size="$(basename "$_icon" .png)"
|
||||||
|
install -Dm644 "$_icon" \
|
||||||
|
"$pkgdir/usr/share/icons/hicolor/$_size/apps/fluxer.png"
|
||||||
|
_found=1
|
||||||
|
done
|
||||||
|
# the .desktop entry points at this icon, so a silent miss would ship a
|
||||||
|
# window with no icon at all
|
||||||
|
if [ "$_found" -eq 0 ]; then
|
||||||
|
echo "Error: no icons in $_dir/resources/icons" >&2
|
||||||
|
ls -la "$srcdir/$_dir/resources" >&2
|
||||||
|
return 1
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
+48
-6
@@ -3,14 +3,56 @@
|
|||||||
# Upstream hosts versioned prebuilt binaries itself, so there is no
|
# Upstream hosts versioned prebuilt binaries itself, so there is no
|
||||||
# build_artifact() here: on a new version only pkgver and the checksums
|
# build_artifact() here: on a new version only pkgver and the checksums
|
||||||
# are refreshed and the result is pushed to the AUR.
|
# are refreshed and the result is pushed to the AUR.
|
||||||
|
#
|
||||||
|
# Versions are date-based: 2026.920.41303 is the build published at
|
||||||
|
# 2026-09-20 04:13:03 UTC, the last field being the time of day without
|
||||||
|
# leading zeros. vercmp orders those correctly both within a day and across
|
||||||
|
# days, and every one of them outranks the 0.0.x versions this package
|
||||||
|
# carried until upstream changed schemes.
|
||||||
|
#
|
||||||
|
# The download API has one URL shape per channel, and this package follows
|
||||||
|
# "stable". Every build publishes a JSON manifest and a .sha256 next to its
|
||||||
|
# artifacts, so neither the version check nor the checksum refresh has to
|
||||||
|
# pull the ~130 MB tarballs to look at them.
|
||||||
|
#
|
||||||
|
# Upstream keeps only its last few builds per channel - everything under the
|
||||||
|
# old scheme is already gone, which is how a pinned 0.0.8 turned into a 404
|
||||||
|
# for anyone installing from the AUR. The version named here stays fetchable
|
||||||
|
# only while this repository keeps pace with the channel.
|
||||||
|
|
||||||
DL_BASE="https://api.fluxer.app/dl/desktop/stable/linux"
|
DL_BASE="https://api.fluxer.app/dl/desktop/stable/linux"
|
||||||
|
|
||||||
latest_version() {
|
latest_version() {
|
||||||
# the download API exposes the current version in the attachment filename,
|
local json ver url
|
||||||
# e.g. content-disposition: attachment; filename="fluxer-stable-0.0.8-x64.tar.gz"
|
|
||||||
curl -sfI "$DL_BASE/x64/latest/tar_gz" \
|
# the channel's manifest for whatever it currently considers current
|
||||||
| grep -oiP 'filename="fluxer-(stable-)?\K[0-9][^"]*(?=-x64\.tar\.gz)'
|
json="$(curl -sfL "$DL_BASE/x64/latest")" || return 1
|
||||||
|
ver="$(jq -r '.version // empty' <<< "$json")"
|
||||||
|
url="$(jq -r '.files.tar_gz.url // empty' <<< "$json")"
|
||||||
|
|
||||||
|
# When stable has no current build the API falls through to another
|
||||||
|
# channel, and the artifact URL is where that becomes visible. A canary
|
||||||
|
# build is a nightly, not what a package called fluxer-bin ships, so that
|
||||||
|
# is EX_TEMPFAIL rather than a version - see scripts/update-package.sh.
|
||||||
|
# The version is shape-checked along with it: pkgver takes no hyphens, and
|
||||||
|
# a channel name in there would be one.
|
||||||
|
if [[ -z "$ver" || "$url" != */desktop/stable/linux/* || ! "$ver" =~ ^[0-9][0-9.]*$ ]]; then
|
||||||
|
echo "the stable channel's current download is \"${url:-<none>}\" at" \
|
||||||
|
"version \"${ver:-<none>}\", which is not a stable build -" \
|
||||||
|
"nothing to update to" >&2
|
||||||
|
return 75
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf '%s\n' "$ver"
|
||||||
|
}
|
||||||
|
|
||||||
|
# _artifact_sha <arch> <version> - upstream's own checksum for that tarball,
|
||||||
|
# published as a sha256sum-format sidecar next to the download itself
|
||||||
|
_artifact_sha() {
|
||||||
|
local sha
|
||||||
|
sha="$(curl -sfL "$DL_BASE/$1/$2/tar_gz.sha256" | grep -ioEm1 '^[0-9a-f]{64}')"
|
||||||
|
[[ -n "$sha" ]] || { echo "upstream publishes no checksum for $1 $2" >&2; return 1; }
|
||||||
|
printf '%s\n' "$sha"
|
||||||
}
|
}
|
||||||
|
|
||||||
# refresh_checksums <version> <pkgbuild-path>
|
# refresh_checksums <version> <pkgbuild-path>
|
||||||
@@ -19,8 +61,8 @@ refresh_checksums() {
|
|||||||
local sha_desktop sha_x64 sha_arm64
|
local sha_desktop sha_x64 sha_arm64
|
||||||
|
|
||||||
sha_desktop="$(sha256sum "$(dirname "$pkgbuild")/fluxer.desktop" | cut -d' ' -f1)"
|
sha_desktop="$(sha256sum "$(dirname "$pkgbuild")/fluxer.desktop" | cut -d' ' -f1)"
|
||||||
sha_x64="$(curl -sfL "$DL_BASE/x64/$ver/tar_gz" | sha256sum | cut -d' ' -f1)"
|
sha_x64="$(_artifact_sha x64 "$ver")" || return 1
|
||||||
sha_arm64="$(curl -sfL "$DL_BASE/arm64/$ver/tar_gz" | sha256sum | cut -d' ' -f1)"
|
sha_arm64="$(_artifact_sha arm64 "$ver")" || return 1
|
||||||
|
|
||||||
sed -i \
|
sed -i \
|
||||||
-e "s|^sha256sums=.*|sha256sums=('$sha_desktop')|" \
|
-e "s|^sha256sums=.*|sha256sums=('$sha_desktop')|" \
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
pkgbase = gearlever-bin
|
|
||||||
pkgdesc = Manage AppImages with ease (prebuilt)
|
|
||||||
pkgver = 4.6.2
|
|
||||||
pkgrel = 2
|
|
||||||
url = https://gearlever.mijorus.it
|
|
||||||
arch = any
|
|
||||||
license = GPL-3.0-or-later
|
|
||||||
depends = gtk4
|
|
||||||
depends = libadwaita
|
|
||||||
depends = glib2
|
|
||||||
depends = dconf
|
|
||||||
depends = hicolor-icon-theme
|
|
||||||
depends = python
|
|
||||||
depends = python-gobject
|
|
||||||
depends = python-dbus
|
|
||||||
depends = python-requests
|
|
||||||
depends = python-pyxdg
|
|
||||||
depends = 7zip
|
|
||||||
depends = binutils
|
|
||||||
depends = squashfs-tools
|
|
||||||
depends = fuse2
|
|
||||||
optdepends = dwarfs: extract AppImages that use a DwarFS filesystem
|
|
||||||
optdepends = libxml2-legacy: required by the LibreOffice AppImage
|
|
||||||
provides = gearlever
|
|
||||||
conflicts = gearlever
|
|
||||||
source = gearlever-bin-4.6.2-2.tar.zst::https://github.com/Felitendo/PKGBUILDS/releases/download/gearlever-bin-4.6.2/gearlever-bin-4.6.2.tar.zst
|
|
||||||
sha256sums = 225dd08d1fbdf33bb5979660737cee180f60b8cfa6477f1553025a6c2f5236a5
|
|
||||||
|
|
||||||
pkgname = gearlever-bin
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
# Maintainer: Felitendo
|
|
||||||
# This PKGBUILD is updated automatically:
|
|
||||||
# https://github.com/Felitendo/PKGBUILDS
|
|
||||||
|
|
||||||
pkgname=gearlever-bin
|
|
||||||
pkgver=4.6.2
|
|
||||||
pkgrel=2
|
|
||||||
pkgdesc="Manage AppImages with ease (prebuilt)"
|
|
||||||
arch=('any')
|
|
||||||
url="https://gearlever.mijorus.it"
|
|
||||||
license=('GPL-3.0-or-later')
|
|
||||||
depends=('gtk4' 'libadwaita' 'glib2' 'dconf' 'hicolor-icon-theme' 'python'
|
|
||||||
'python-gobject' 'python-dbus' 'python-requests' 'python-pyxdg'
|
|
||||||
'7zip' 'binutils' 'squashfs-tools' 'fuse2')
|
|
||||||
optdepends=('dwarfs: extract AppImages that use a DwarFS filesystem'
|
|
||||||
'libxml2-legacy: required by the LibreOffice AppImage')
|
|
||||||
provides=('gearlever')
|
|
||||||
conflicts=('gearlever')
|
|
||||||
source=("${pkgname}-${pkgver}-${pkgrel}.tar.zst::https://github.com/Felitendo/PKGBUILDS/releases/download/${pkgname}-${pkgver}/${pkgname}-${pkgver}.tar.zst")
|
|
||||||
sha256sums=('225dd08d1fbdf33bb5979660737cee180f60b8cfa6477f1553025a6c2f5236a5')
|
|
||||||
|
|
||||||
package() {
|
|
||||||
cp -a "$srcdir/usr" "$pkgdir/"
|
|
||||||
}
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
# gearlever-bin - prebuilt package of https://github.com/mijorus/gearlever
|
|
||||||
# ("Gear Lever", a GTK4 + LibAdwaita AppImage manager written in Python).
|
|
||||||
#
|
|
||||||
# Upstream only publishes a Flatpak bundle, so build_artifact() builds the
|
|
||||||
# app from the release tarball and the resulting install tree is published as
|
|
||||||
# a GitHub release asset of this repository, which the PKGBUILD then uses.
|
|
||||||
|
|
||||||
UPSTREAM_REPO="mijorus/gearlever"
|
|
||||||
|
|
||||||
# Installed in CI (pacman) before build_artifact runs.
|
|
||||||
BUILD_DEPS=(meson ninja glib2 glib2-devel python gettext python-pip)
|
|
||||||
|
|
||||||
latest_version() {
|
|
||||||
# gh instead of curl: unauthenticated GitHub API calls are rate-limited on
|
|
||||||
# shared CI runner IPs.
|
|
||||||
gh api "repos/$UPSTREAM_REPO/releases/latest" --jq '.tag_name' | sed 's/^v//'
|
|
||||||
}
|
|
||||||
|
|
||||||
# build_artifact <version> <output-file>
|
|
||||||
build_artifact() {
|
|
||||||
local ver="$1" outfile="$2"
|
|
||||||
local workdir destdir srctree
|
|
||||||
workdir="$(mktemp -d)"
|
|
||||||
destdir="$(mktemp -d)"
|
|
||||||
|
|
||||||
curl -sfL "https://github.com/$UPSTREAM_REPO/archive/refs/tags/$ver.tar.gz" | tar -xz -C "$workdir"
|
|
||||||
srctree="$workdir/gearlever-$ver"
|
|
||||||
|
|
||||||
# Arch's 7zip package ships /usr/bin/7z, not the 7zz binary the Flatpak
|
|
||||||
# bundles, and the ELF-offset helper lives in /usr/lib/gearlever instead of
|
|
||||||
# somewhere on $PATH.
|
|
||||||
sed -i -e 's/7zz/7z/g' \
|
|
||||||
-e 's|get_appimage_offset|/usr/lib/gearlever/get_appimage_offset|g' \
|
|
||||||
"$srctree/src/providers/AppImageProvider.py"
|
|
||||||
|
|
||||||
meson setup "$workdir/build" "$srctree" --prefix=/usr --buildtype=release
|
|
||||||
meson install -C "$workdir/build" --destdir "$destdir"
|
|
||||||
|
|
||||||
install -Dm755 "$srctree/build-aux/get_appimage_offset.sh" \
|
|
||||||
"$destdir/usr/lib/gearlever/get_appimage_offset"
|
|
||||||
|
|
||||||
# src/meson.build uses install_subdir('.'), which drags the meson.build
|
|
||||||
# files themselves into the install tree.
|
|
||||||
find "$destdir" -name meson.build -delete
|
|
||||||
|
|
||||||
# ftputil and desktop-entry-lib are AUR-only; bundle them (pure python)
|
|
||||||
# into the app's module dir, which the launcher puts on sys.path. Versions
|
|
||||||
# come from upstream's requirements.txt pins.
|
|
||||||
grep -E '^(ftputil|desktop-entry-lib)' "$srctree/requirements.txt" > "$workdir/bundle-reqs.txt"
|
|
||||||
[[ "$(wc -l < "$workdir/bundle-reqs.txt")" -eq 2 ]] || { echo "expected 2 pinned bundle deps in requirements.txt" >&2; return 1; }
|
|
||||||
python -m pip install --isolated --no-deps --target "$destdir/usr/share/gearlever" \
|
|
||||||
-r "$workdir/bundle-reqs.txt"
|
|
||||||
rm -rf "$destdir/usr/share/gearlever/bin"
|
|
||||||
|
|
||||||
# These caches are generated by pacman hooks; shipping them would cause
|
|
||||||
# file conflicts on install.
|
|
||||||
rm -f "$destdir/usr/share/glib-2.0/schemas/gschemas.compiled" \
|
|
||||||
"$destdir/usr/share/applications/mimeinfo.cache" \
|
|
||||||
"$destdir/usr/share/icons/hicolor/icon-theme.cache"
|
|
||||||
|
|
||||||
tar --zstd --sort=name --owner=0 --group=0 --numeric-owner --mtime='@0' \
|
|
||||||
-cf "$outfile" -C "$destdir" usr
|
|
||||||
|
|
||||||
rm -rf "$workdir" "$destdir"
|
|
||||||
}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
pkgbase = gnome-network-displays-bin
|
|
||||||
pkgdesc = Screencasting for GNOME - Miracast and Chromecast (prebuilt)
|
|
||||||
pkgver = 0.99.0
|
|
||||||
pkgrel = 1
|
|
||||||
url = https://gitlab.gnome.org/GNOME/gnome-network-displays
|
|
||||||
arch = x86_64
|
|
||||||
license = GPL-3.0-or-later
|
|
||||||
depends = avahi
|
|
||||||
depends = dnsmasq
|
|
||||||
depends = gst-plugin-pipewire
|
|
||||||
depends = gst-plugins-bad
|
|
||||||
depends = gst-plugins-good
|
|
||||||
depends = gst-plugins-ugly
|
|
||||||
depends = gst-rtsp-server
|
|
||||||
depends = gstreamer
|
|
||||||
depends = gtk4
|
|
||||||
depends = json-glib
|
|
||||||
depends = libadwaita
|
|
||||||
depends = libnm
|
|
||||||
depends = libportal
|
|
||||||
depends = libportal-gtk4
|
|
||||||
depends = libpulse
|
|
||||||
depends = libsoup3
|
|
||||||
depends = networkmanager
|
|
||||||
depends = protobuf-c
|
|
||||||
depends = xdg-desktop-portal
|
|
||||||
depends = hicolor-icon-theme
|
|
||||||
optdepends = gstreamer-vaapi: hardware accelerated encoding
|
|
||||||
provides = gnome-network-displays
|
|
||||||
conflicts = gnome-network-displays
|
|
||||||
source = gnome-network-displays-bin-0.99.0-1.tar.zst::https://github.com/Felitendo/PKGBUILDS/releases/download/gnome-network-displays-bin-0.99.0/gnome-network-displays-bin-0.99.0.tar.zst
|
|
||||||
sha256sums = 6e7f93f491226bab6ae54139dcaf009d9cedd8e983b04b5128701c3250936ac1
|
|
||||||
|
|
||||||
pkgname = gnome-network-displays-bin
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
# Maintainer: Felitendo
|
|
||||||
# This PKGBUILD is updated automatically:
|
|
||||||
# https://github.com/Felitendo/PKGBUILDS
|
|
||||||
|
|
||||||
pkgname=gnome-network-displays-bin
|
|
||||||
pkgver=0.99.0
|
|
||||||
pkgrel=1
|
|
||||||
pkgdesc="Screencasting for GNOME - Miracast and Chromecast (prebuilt)"
|
|
||||||
arch=('x86_64')
|
|
||||||
url="https://gitlab.gnome.org/GNOME/gnome-network-displays"
|
|
||||||
license=('GPL-3.0-or-later')
|
|
||||||
depends=('avahi' 'dnsmasq' 'gst-plugin-pipewire' 'gst-plugins-bad'
|
|
||||||
'gst-plugins-good' 'gst-plugins-ugly' 'gst-rtsp-server' 'gstreamer'
|
|
||||||
'gtk4' 'json-glib' 'libadwaita' 'libnm' 'libportal' 'libportal-gtk4'
|
|
||||||
'libpulse' 'libsoup3' 'networkmanager' 'protobuf-c'
|
|
||||||
'xdg-desktop-portal' 'hicolor-icon-theme')
|
|
||||||
optdepends=('gstreamer-vaapi: hardware accelerated encoding')
|
|
||||||
provides=('gnome-network-displays')
|
|
||||||
conflicts=('gnome-network-displays')
|
|
||||||
source=("${pkgname}-${pkgver}-${pkgrel}.tar.zst::https://github.com/Felitendo/PKGBUILDS/releases/download/${pkgname}-${pkgver}/${pkgname}-${pkgver}.tar.zst")
|
|
||||||
sha256sums=('6e7f93f491226bab6ae54139dcaf009d9cedd8e983b04b5128701c3250936ac1')
|
|
||||||
|
|
||||||
package() {
|
|
||||||
cp -a "$srcdir/usr" "$pkgdir/"
|
|
||||||
}
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
# gnome-network-displays-bin - prebuilt package of
|
|
||||||
# https://gitlab.gnome.org/GNOME/gnome-network-displays
|
|
||||||
# (GNOME screencasting via Miracast/Chromecast, C + GTK4/LibAdwaita).
|
|
||||||
#
|
|
||||||
# Upstream publishes no binary assets, so build_artifact() builds from the
|
|
||||||
# GitLab release tarball.
|
|
||||||
|
|
||||||
GITLAB_PROJECT="GNOME%2Fgnome-network-displays"
|
|
||||||
|
|
||||||
# Installed in CI (pacman) before build_artifact runs.
|
|
||||||
BUILD_DEPS=(meson ninja glib2-devel gettext gtk4 libadwaita gstreamer
|
|
||||||
gst-rtsp-server gst-plugins-bad json-glib libnm libportal
|
|
||||||
libportal-gtk4 libpulse libsoup3 protobuf-c avahi)
|
|
||||||
|
|
||||||
latest_version() {
|
|
||||||
curl -sf "https://gitlab.gnome.org/api/v4/projects/$GITLAB_PROJECT/releases?per_page=1" \
|
|
||||||
| jq -r '.[0].tag_name' | sed 's/^v//'
|
|
||||||
}
|
|
||||||
|
|
||||||
# build_artifact <version> <output-file>
|
|
||||||
build_artifact() {
|
|
||||||
local ver="$1" outfile="$2"
|
|
||||||
local workdir destdir srctree
|
|
||||||
workdir="$(mktemp -d)"
|
|
||||||
destdir="$(mktemp -d)"
|
|
||||||
|
|
||||||
curl -sfL "https://gitlab.gnome.org/GNOME/gnome-network-displays/-/archive/$ver/gnome-network-displays-$ver.tar.gz" \
|
|
||||||
| tar -xz -C "$workdir"
|
|
||||||
srctree="$workdir/gnome-network-displays-$ver"
|
|
||||||
|
|
||||||
# Arch has no /usr/libexec; same fix as the AUR source package
|
|
||||||
sed -i 's/libexec/lib/g' "$srctree/src/nd-systemd-helpers.c" "$srctree/src/meson.build"
|
|
||||||
|
|
||||||
meson setup "$workdir/build" "$srctree" --prefix=/usr --buildtype=release
|
|
||||||
meson install -C "$workdir/build" --destdir "$destdir"
|
|
||||||
|
|
||||||
# These caches are generated by pacman hooks; shipping them would cause
|
|
||||||
# file conflicts on install.
|
|
||||||
rm -f "$destdir/usr/share/glib-2.0/schemas/gschemas.compiled" \
|
|
||||||
"$destdir/usr/share/applications/mimeinfo.cache" \
|
|
||||||
"$destdir/usr/share/icons/hicolor/icon-theme.cache"
|
|
||||||
|
|
||||||
tar --zstd --sort=name --owner=0 --group=0 --numeric-owner --mtime='@0' \
|
|
||||||
-cf "$outfile" -C "$destdir" usr
|
|
||||||
|
|
||||||
rm -rf "$workdir" "$destdir"
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
pkgbase = kitty-tune-bin
|
||||||
|
pkgdesc = SoundCloud and YouTube music player (upstream binary)
|
||||||
|
pkgver = 1.4.1
|
||||||
|
pkgrel = 1
|
||||||
|
url = https://github.com/alan7383/KittyTuneDesktop
|
||||||
|
arch = x86_64
|
||||||
|
arch = aarch64
|
||||||
|
license = MIT
|
||||||
|
depends = alsa-lib
|
||||||
|
depends = brotli
|
||||||
|
depends = bzip2
|
||||||
|
depends = expat
|
||||||
|
depends = fontconfig
|
||||||
|
depends = freetype2
|
||||||
|
depends = gcc-libs
|
||||||
|
depends = glibc
|
||||||
|
depends = gtk3
|
||||||
|
depends = hicolor-icon-theme
|
||||||
|
depends = libbsd
|
||||||
|
depends = libglvnd
|
||||||
|
depends = libmd
|
||||||
|
depends = libpng
|
||||||
|
depends = libx11
|
||||||
|
depends = libxau
|
||||||
|
depends = libxcb
|
||||||
|
depends = libxdmcp
|
||||||
|
depends = libxext
|
||||||
|
depends = libxi
|
||||||
|
depends = libxrender
|
||||||
|
depends = libxtst
|
||||||
|
depends = xdg-utils
|
||||||
|
depends = zlib
|
||||||
|
provides = kitty-tune=1.4.1
|
||||||
|
conflicts = kitty-tune
|
||||||
|
noextract = kitty-tune-bin-1.4.1-x86_64.deb
|
||||||
|
noextract = kitty-tune-bin-1.4.1-aarch64.deb
|
||||||
|
options = !strip
|
||||||
|
options = !debug
|
||||||
|
source = kitty-tune-bin-1.4.1-README.md::https://raw.githubusercontent.com/alan7383/KittyTuneDesktop/v1.4.1/README.md
|
||||||
|
sha256sums = bd8242976bf55d5b44ed3bad59d26baf2f2103d3244f20348630f30bd6d21eae
|
||||||
|
source_x86_64 = kitty-tune-bin-1.4.1-x86_64.deb::https://github.com/alan7383/KittyTuneDesktop/releases/download/v1.4.1/kitty-tune_1.4.1_amd64.deb
|
||||||
|
sha256sums_x86_64 = be47d51eea1bd400bb6a52c38b84043e55cd777d36c6a51ee2c519c118ae6a14
|
||||||
|
source_aarch64 = kitty-tune-bin-1.4.1-aarch64.deb::https://github.com/alan7383/KittyTuneDesktop/releases/download/v1.4.1/kitty-tune_1.4.1_arm64.deb
|
||||||
|
sha256sums_aarch64 = 3ffe6f0e9658040a92458a3071052a26aad83debcfb88d65d7ba80883a660f22
|
||||||
|
|
||||||
|
pkgname = kitty-tune-bin
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
# Maintainer: Felitendo
|
||||||
|
# This PKGBUILD is updated automatically:
|
||||||
|
# https://git.felo.gg/Felitendo/PKGBUILDS
|
||||||
|
|
||||||
|
pkgname=kitty-tune-bin
|
||||||
|
pkgver=1.4.1
|
||||||
|
pkgrel=1
|
||||||
|
pkgdesc="SoundCloud and YouTube music player (upstream binary)"
|
||||||
|
arch=('x86_64' 'aarch64')
|
||||||
|
url="https://github.com/alan7383/KittyTuneDesktop"
|
||||||
|
license=('MIT')
|
||||||
|
# jpackage bundles Java and FFmpeg. These are the system libraries declared
|
||||||
|
# by both upstream .debs, plus GTK for the bundled JRE's desktop integration.
|
||||||
|
depends=('alsa-lib' 'brotli' 'bzip2' 'expat' 'fontconfig' 'freetype2'
|
||||||
|
'gcc-libs' 'glibc' 'gtk3' 'hicolor-icon-theme' 'libbsd' 'libglvnd'
|
||||||
|
'libmd' 'libpng' 'libx11' 'libxau' 'libxcb' 'libxdmcp' 'libxext'
|
||||||
|
'libxi' 'libxrender' 'libxtst' 'xdg-utils' 'zlib')
|
||||||
|
provides=("kitty-tune=${pkgver}")
|
||||||
|
conflicts=('kitty-tune')
|
||||||
|
options=('!strip' '!debug')
|
||||||
|
# Upstream declares MIT in the README but ships no standalone license text.
|
||||||
|
source=("${pkgname}-${pkgver}-README.md::https://raw.githubusercontent.com/alan7383/KittyTuneDesktop/v${pkgver}/README.md")
|
||||||
|
source_x86_64=("${pkgname}-${pkgver}-x86_64.deb::https://github.com/alan7383/KittyTuneDesktop/releases/download/v${pkgver}/kitty-tune_${pkgver}_amd64.deb")
|
||||||
|
source_aarch64=("${pkgname}-${pkgver}-aarch64.deb::https://github.com/alan7383/KittyTuneDesktop/releases/download/v${pkgver}/kitty-tune_${pkgver}_arm64.deb")
|
||||||
|
noextract=("${pkgname}-${pkgver}-x86_64.deb" "${pkgname}-${pkgver}-aarch64.deb")
|
||||||
|
sha256sums=('bd8242976bf55d5b44ed3bad59d26baf2f2103d3244f20348630f30bd6d21eae')
|
||||||
|
sha256sums_x86_64=('be47d51eea1bd400bb6a52c38b84043e55cd777d36c6a51ee2c519c118ae6a14')
|
||||||
|
sha256sums_aarch64=('3ffe6f0e9658040a92458a3071052a26aad83debcfb88d65d7ba80883a660f22')
|
||||||
|
|
||||||
|
package() {
|
||||||
|
bsdtar -xOf "$srcdir/${pkgname}-${pkgver}-${CARCH}.deb" 'data.tar.*' \
|
||||||
|
| bsdtar -xpf - -C "$pkgdir" ./opt
|
||||||
|
|
||||||
|
install -d "$pkgdir/usr/bin"
|
||||||
|
ln -s /opt/kitty-tune/bin/KittyTune "$pkgdir/usr/bin/kitty-tune"
|
||||||
|
|
||||||
|
# The .deb registers this through postinst, which pacman never executes.
|
||||||
|
install -Dm644 "$pkgdir/opt/kitty-tune/lib/kitty-tune-KittyTune.desktop" \
|
||||||
|
"$pkgdir/usr/share/applications/kitty-tune.desktop"
|
||||||
|
sed -i \
|
||||||
|
-e 's|^Exec=.*|Exec=kitty-tune|' \
|
||||||
|
-e 's|^Icon=.*|Icon=kittytune|' \
|
||||||
|
-e 's|^Categories=.*|Categories=AudioVideo;Audio;Player;|' \
|
||||||
|
-e '/^MimeType=$/d' \
|
||||||
|
"$pkgdir/usr/share/applications/kitty-tune.desktop"
|
||||||
|
install -Dm644 "$pkgdir/opt/kitty-tune/lib/KittyTune.png" \
|
||||||
|
"$pkgdir/usr/share/icons/hicolor/512x512/apps/kittytune.png"
|
||||||
|
|
||||||
|
install -Dm644 "$srcdir/${pkgname}-${pkgver}-README.md" \
|
||||||
|
"$pkgdir/usr/share/licenses/$pkgname/README.md"
|
||||||
|
install -Dm644 "$pkgdir/opt/kitty-tune/share/doc/copyright" \
|
||||||
|
"$pkgdir/usr/share/licenses/$pkgname/copyright"
|
||||||
|
|
||||||
|
# The in-app updater installs upstream's differently named kitty-tune
|
||||||
|
# package. The conflict above prevents an unattended replacement; use an
|
||||||
|
# AUR helper to update kitty-tune-bin instead.
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
# kitty-tune-bin - KittyTune Desktop, a Kotlin/Compose music player.
|
||||||
|
# Repackage upstream's .debs for x86_64 and aarch64, including their JRE.
|
||||||
|
|
||||||
|
UPSTREAM_REPO="alan7383/KittyTuneDesktop"
|
||||||
|
|
||||||
|
latest_version() {
|
||||||
|
gh api "repos/$UPSTREAM_REPO/releases/latest" --jq '.tag_name' | sed 's/^v//'
|
||||||
|
}
|
||||||
|
|
||||||
|
# refresh_checksums <version> <pkgbuild-path>
|
||||||
|
refresh_checksums() {
|
||||||
|
local ver="$1" pkgbuild="$2"
|
||||||
|
local base sha_readme sha_x64 sha_arm64
|
||||||
|
|
||||||
|
base="https://github.com/$UPSTREAM_REPO/releases/download/v$ver"
|
||||||
|
sha_readme="$(set -o pipefail; curl -fsSL "https://raw.githubusercontent.com/$UPSTREAM_REPO/v$ver/README.md" \
|
||||||
|
| sha256sum | cut -d' ' -f1)" || return 1
|
||||||
|
sha_x64="$(set -o pipefail; curl -fsSL "$base/kitty-tune_${ver}_amd64.deb" \
|
||||||
|
| sha256sum | cut -d' ' -f1)" || return 1
|
||||||
|
sha_arm64="$(set -o pipefail; curl -fsSL "$base/kitty-tune_${ver}_arm64.deb" \
|
||||||
|
| sha256sum | cut -d' ' -f1)" || return 1
|
||||||
|
|
||||||
|
sed -i \
|
||||||
|
-e "s|^sha256sums=.*|sha256sums=('$sha_readme')|" \
|
||||||
|
-e "s|^sha256sums_x86_64=.*|sha256sums_x86_64=('$sha_x64')|" \
|
||||||
|
-e "s|^sha256sums_aarch64=.*|sha256sums_aarch64=('$sha_arm64')|" \
|
||||||
|
"$pkgbuild"
|
||||||
|
}
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
pkgbase = librepods-bin
|
|
||||||
pkgdesc = AirPods liberated from Apple's ecosystem (prebuilt)
|
|
||||||
pkgver = 1.0.0rc1
|
|
||||||
pkgrel = 1
|
|
||||||
url = https://github.com/librepods-org/librepods
|
|
||||||
arch = x86_64
|
|
||||||
license = GPL-3.0-only
|
|
||||||
depends = glibc
|
|
||||||
depends = gcc-libs
|
|
||||||
depends = hicolor-icon-theme
|
|
||||||
depends = libpulse
|
|
||||||
depends = openssl
|
|
||||||
depends = qt6-base
|
|
||||||
depends = qt6-connectivity
|
|
||||||
depends = qt6-declarative
|
|
||||||
provides = librepods
|
|
||||||
conflicts = librepods
|
|
||||||
source = librepods-bin-1.0.0rc1-1.tar.zst::https://github.com/Felitendo/PKGBUILDS/releases/download/librepods-bin-1.0.0rc1/librepods-bin-1.0.0rc1.tar.zst
|
|
||||||
sha256sums = 69ce19414a0205d1d19fb851f6adea6c231013df6ec8a32bc8122d5fd6e9dd52
|
|
||||||
|
|
||||||
pkgname = librepods-bin
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
# Maintainer: Felitendo
|
|
||||||
# This PKGBUILD is updated automatically:
|
|
||||||
# https://github.com/Felitendo/PKGBUILDS
|
|
||||||
|
|
||||||
pkgname=librepods-bin
|
|
||||||
pkgver=1.0.0rc1
|
|
||||||
pkgrel=1
|
|
||||||
pkgdesc="AirPods liberated from Apple's ecosystem (prebuilt)"
|
|
||||||
arch=('x86_64')
|
|
||||||
url="https://github.com/librepods-org/librepods"
|
|
||||||
license=('GPL-3.0-only')
|
|
||||||
depends=('glibc' 'gcc-libs' 'hicolor-icon-theme' 'libpulse' 'openssl'
|
|
||||||
'qt6-base' 'qt6-connectivity' 'qt6-declarative')
|
|
||||||
provides=('librepods')
|
|
||||||
conflicts=('librepods')
|
|
||||||
source=("${pkgname}-${pkgver}-${pkgrel}.tar.zst::https://github.com/Felitendo/PKGBUILDS/releases/download/${pkgname}-${pkgver}/${pkgname}-${pkgver}.tar.zst")
|
|
||||||
sha256sums=('69ce19414a0205d1d19fb851f6adea6c231013df6ec8a32bc8122d5fd6e9dd52')
|
|
||||||
|
|
||||||
package() {
|
|
||||||
cp -a "$srcdir/usr" "$pkgdir/"
|
|
||||||
}
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
# librepods-bin - prebuilt package of https://github.com/librepods-org/librepods
|
|
||||||
# (AirPods integration for Linux, Qt6/C++ client in the linux/ subdirectory).
|
|
||||||
#
|
|
||||||
# Upstream releases carry only Android APKs, so build_artifact() builds the
|
|
||||||
# Linux client from the release tarball. Upstream tags look like v1.0.0-rc1;
|
|
||||||
# pkgver strips the hyphen (1.0.0rc1, sorts before 1.0.0 in vercmp) and
|
|
||||||
# build_artifact re-inserts it for the tag URL.
|
|
||||||
|
|
||||||
UPSTREAM_REPO="librepods-org/librepods"
|
|
||||||
|
|
||||||
# Installed in CI (pacman) before build_artifact runs.
|
|
||||||
BUILD_DEPS=(cmake qt6-base qt6-connectivity qt6-declarative qt6-tools
|
|
||||||
libpulse openssl)
|
|
||||||
|
|
||||||
latest_version() {
|
|
||||||
gh api "repos/$UPSTREAM_REPO/releases/latest" --jq '.tag_name' | sed 's/^v//; s/-//g'
|
|
||||||
}
|
|
||||||
|
|
||||||
# build_artifact <version> <output-file>
|
|
||||||
build_artifact() {
|
|
||||||
local ver="$1" outfile="$2"
|
|
||||||
local upver workdir destdir srctree
|
|
||||||
upver="$(sed -E 's/([a-z])/-\1/' <<< "$ver")"
|
|
||||||
workdir="$(mktemp -d)"
|
|
||||||
destdir="$(mktemp -d)"
|
|
||||||
|
|
||||||
curl -sfL "https://github.com/$UPSTREAM_REPO/archive/refs/tags/v$upver.tar.gz" | tar -xz -C "$workdir"
|
|
||||||
srctree="$workdir/librepods-$upver"
|
|
||||||
|
|
||||||
cmake -B "$workdir/build" -S "$srctree/linux" -Wno-dev \
|
|
||||||
-DCMAKE_BUILD_TYPE=Release \
|
|
||||||
-DCMAKE_INSTALL_PREFIX=/usr \
|
|
||||||
-DCMAKE_SKIP_RPATH=TRUE
|
|
||||||
cmake --build "$workdir/build" -j"$(nproc)"
|
|
||||||
DESTDIR="$destdir" cmake --install "$workdir/build"
|
|
||||||
|
|
||||||
# These caches are generated by pacman hooks; shipping them would cause
|
|
||||||
# file conflicts on install.
|
|
||||||
rm -f "$destdir/usr/share/applications/mimeinfo.cache" \
|
|
||||||
"$destdir/usr/share/icons/hicolor/icon-theme.cache"
|
|
||||||
|
|
||||||
tar --zstd --sort=name --owner=0 --group=0 --numeric-owner --mtime='@0' \
|
|
||||||
-cf "$outfile" -C "$destdir" usr
|
|
||||||
|
|
||||||
rm -rf "$workdir" "$destdir"
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
pkgbase = linux-wallpaperengine-bin
|
|
||||||
pkgdesc = Use Steam's Wallpaper Engine wallpapers on Linux (prebuilt snapshot of main)
|
|
||||||
pkgver = r627.b016d7d
|
|
||||||
pkgrel = 1
|
|
||||||
url = https://github.com/Almamu/linux-wallpaperengine
|
|
||||||
arch = x86_64
|
|
||||||
license = GPL-3.0-only
|
|
||||||
depends = lz4
|
|
||||||
depends = ffmpeg
|
|
||||||
depends = mpv
|
|
||||||
depends = glfw
|
|
||||||
depends = glew
|
|
||||||
depends = freeglut
|
|
||||||
depends = libpulse
|
|
||||||
depends = libcups
|
|
||||||
depends = at-spi2-core
|
|
||||||
depends = nss
|
|
||||||
depends = libxcomposite
|
|
||||||
depends = libxdamage
|
|
||||||
depends = nspr
|
|
||||||
provides = linux-wallpaperengine
|
|
||||||
conflicts = linux-wallpaperengine
|
|
||||||
conflicts = linux-wallpaperengine-git
|
|
||||||
options = !strip
|
|
||||||
options = !debug
|
|
||||||
source = linux-wallpaperengine-bin-r627.b016d7d-1.tar.zst::https://github.com/Felitendo/PKGBUILDS/releases/download/linux-wallpaperengine-bin-r627.b016d7d/linux-wallpaperengine-bin-r627.b016d7d.tar.zst
|
|
||||||
sha256sums = ed71a7ca046003c368b6af7aa9766dee36cd5da84921a4a34991248d62d7bc6b
|
|
||||||
|
|
||||||
pkgname = linux-wallpaperengine-bin
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
# Maintainer: Felitendo
|
|
||||||
# This PKGBUILD is updated automatically:
|
|
||||||
# https://github.com/Felitendo/PKGBUILDS
|
|
||||||
|
|
||||||
pkgname=linux-wallpaperengine-bin
|
|
||||||
pkgver=r627.b016d7d
|
|
||||||
pkgrel=1
|
|
||||||
pkgdesc="Use Steam's Wallpaper Engine wallpapers on Linux (prebuilt snapshot of main)"
|
|
||||||
arch=('x86_64')
|
|
||||||
url="https://github.com/Almamu/linux-wallpaperengine"
|
|
||||||
license=('GPL-3.0-only')
|
|
||||||
depends=('lz4' 'ffmpeg' 'mpv' 'glfw' 'glew' 'freeglut' 'libpulse' 'libcups'
|
|
||||||
'at-spi2-core' 'nss' 'libxcomposite' 'libxdamage' 'nspr')
|
|
||||||
provides=('linux-wallpaperengine')
|
|
||||||
conflicts=('linux-wallpaperengine' 'linux-wallpaperengine-git')
|
|
||||||
options=('!strip' '!debug')
|
|
||||||
source=("${pkgname}-${pkgver}-${pkgrel}.tar.zst::https://github.com/Felitendo/PKGBUILDS/releases/download/${pkgname}-${pkgver}/${pkgname}-${pkgver}.tar.zst")
|
|
||||||
sha256sums=('ed71a7ca046003c368b6af7aa9766dee36cd5da84921a4a34991248d62d7bc6b')
|
|
||||||
|
|
||||||
package() {
|
|
||||||
cp -a "$srcdir/usr" "$pkgdir/"
|
|
||||||
cp -a "$srcdir/opt" "$pkgdir/"
|
|
||||||
}
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
# linux-wallpaperengine-bin - prebuilt package of
|
|
||||||
# https://github.com/Almamu/linux-wallpaperengine (Wallpaper Engine backgrounds
|
|
||||||
# on Linux, C++/CMake, bundles CEF for web wallpapers).
|
|
||||||
#
|
|
||||||
# Upstream has no releases or tags, so versions are commit snapshots of main
|
|
||||||
# in the same "r<commit count>.<short sha>" format the AUR -git package uses.
|
|
||||||
# Every new upstream commit therefore produces a new build.
|
|
||||||
|
|
||||||
UPSTREAM_REPO="Almamu/linux-wallpaperengine"
|
|
||||||
|
|
||||||
# Installed in CI (pacman) before build_artifact runs.
|
|
||||||
BUILD_DEPS=(cmake git sdl2 glm wayland-protocols xorg-xrandr lz4 ffmpeg mpv
|
|
||||||
glfw glew freeglut libpulse libcups at-spi2-core nss libxcomposite
|
|
||||||
libxdamage nspr dbus freetype2)
|
|
||||||
|
|
||||||
latest_version() {
|
|
||||||
local sha count
|
|
||||||
sha="$(gh api "repos/$UPSTREAM_REPO/commits/main" --jq '.sha')" || return 1
|
|
||||||
# total commit count on main, from the Link pagination header
|
|
||||||
count="$(gh api -i "repos/$UPSTREAM_REPO/commits?sha=main&per_page=1" \
|
|
||||||
| grep -oiP 'page=\K[0-9]+(?=>; rel="last")')" || return 1
|
|
||||||
[[ -n "$sha" && -n "$count" ]] || return 1
|
|
||||||
echo "r${count}.${sha:0:7}"
|
|
||||||
}
|
|
||||||
|
|
||||||
# build_artifact <version> <output-file>
|
|
||||||
build_artifact() {
|
|
||||||
local ver="$1" outfile="$2"
|
|
||||||
local sha="${ver##*.}"
|
|
||||||
local workdir destdir srctree actual
|
|
||||||
workdir="$(mktemp -d)"
|
|
||||||
destdir="$(mktemp -d)"
|
|
||||||
srctree="$workdir/src"
|
|
||||||
|
|
||||||
git clone "https://github.com/$UPSTREAM_REPO.git" "$srctree"
|
|
||||||
git -C "$srctree" checkout "$sha"
|
|
||||||
git -C "$srctree" submodule update --init --recursive
|
|
||||||
|
|
||||||
# make sure the checkout is really the snapshot the version claims to be
|
|
||||||
actual="r$(git -C "$srctree" rev-list --count HEAD).$(git -C "$srctree" rev-parse --short=7 HEAD)"
|
|
||||||
if [[ "$actual" != "$ver" ]]; then
|
|
||||||
echo "snapshot mismatch: checked out $actual, expected $ver" >&2
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# flags as in the AUR -git package; CEF is fetched by CMake during setup
|
|
||||||
cmake -B "$workdir/build" -S "$srctree" \
|
|
||||||
-DCMAKE_BUILD_TYPE=Release \
|
|
||||||
-DCMAKE_INSTALL_PREFIX=/opt/linux-wallpaperengine \
|
|
||||||
-Wno-dev \
|
|
||||||
-DCMAKE_CXX_FLAGS='-ffat-lto-objects -Wno-builtin-macro-redefined' \
|
|
||||||
-DCMAKE_C_FLAGS='-Wno-builtin-macro-redefined'
|
|
||||||
cmake --build "$workdir/build" -j"$(nproc)"
|
|
||||||
DESTDIR="$destdir" cmake --install "$workdir/build"
|
|
||||||
chmod 755 "$destdir/opt/linux-wallpaperengine/linux-wallpaperengine"
|
|
||||||
|
|
||||||
# forwarding script, as in the AUR -git package
|
|
||||||
mkdir -p "$destdir/usr/bin"
|
|
||||||
cat > "$destdir/usr/bin/linux-wallpaperengine" << 'EOF'
|
|
||||||
#!/bin/bash
|
|
||||||
export LD_LIBRARY_PATH="/opt/linux-wallpaperengine/lib:$LD_LIBRARY_PATH"
|
|
||||||
cd /opt/linux-wallpaperengine
|
|
||||||
exec ./linux-wallpaperengine "$@"
|
|
||||||
EOF
|
|
||||||
chmod 755 "$destdir/usr/bin/linux-wallpaperengine"
|
|
||||||
|
|
||||||
tar --zstd --sort=name --owner=0 --group=0 --numeric-owner --mtime='@0' \
|
|
||||||
-cf "$outfile" -C "$destdir" usr opt
|
|
||||||
|
|
||||||
rm -rf "$workdir" "$destdir"
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
pkgbase = lunar-client-bin
|
pkgbase = lunar-client-bin
|
||||||
pkgdesc = PvP modpack for all modern versions of Minecraft (upstream AppImage)
|
pkgdesc = PvP modpack for all modern versions of Minecraft (upstream AppImage)
|
||||||
pkgver = 3.7.12
|
pkgver = 3.7.17
|
||||||
pkgrel = 1
|
pkgrel = 2
|
||||||
url = https://lunarclient.com
|
url = https://lunarclient.com
|
||||||
arch = x86_64
|
arch = x86_64
|
||||||
license = LicenseRef-proprietary
|
license = LicenseRef-proprietary
|
||||||
@@ -13,7 +13,7 @@ pkgbase = lunar-client-bin
|
|||||||
conflicts = lunarclient
|
conflicts = lunarclient
|
||||||
options = !strip
|
options = !strip
|
||||||
options = !debug
|
options = !debug
|
||||||
source = lunarclient-3.7.12.AppImage::https://launcherupdates.lunarclientcdn.com/Lunar%20Client-3.7.12-ow.AppImage
|
source = lunarclient-3.7.17.AppImage::https://launcherupdates.lunarclientcdn.com/Lunar%20Client-3.7.17-ow.AppImage
|
||||||
sha256sums = 7364e876a59291d8b0b7d6c0efdacb988617e35e054e9c21a5814d071710bf98
|
sha256sums = 4d298f99de13941c37f044623c02687d59ad52cbcedb7eab5d5b297db1937470
|
||||||
|
|
||||||
pkgname = lunar-client-bin
|
pkgname = lunar-client-bin
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
# Maintainer: Felitendo
|
# Maintainer: Felitendo
|
||||||
# This PKGBUILD is updated automatically:
|
# This PKGBUILD is updated automatically:
|
||||||
# https://github.com/Felitendo/PKGBUILDS
|
# https://git.felo.gg/Felitendo/PKGBUILDS
|
||||||
|
|
||||||
pkgname=lunar-client-bin
|
pkgname=lunar-client-bin
|
||||||
_pkgname=lunarclient
|
_pkgname=lunarclient
|
||||||
pkgver=3.7.12
|
pkgver=3.7.17
|
||||||
pkgrel=1
|
pkgrel=2
|
||||||
pkgdesc="PvP modpack for all modern versions of Minecraft (upstream AppImage)"
|
pkgdesc="PvP modpack for all modern versions of Minecraft (upstream AppImage)"
|
||||||
arch=('x86_64')
|
arch=('x86_64')
|
||||||
url="https://lunarclient.com"
|
url="https://lunarclient.com"
|
||||||
@@ -15,9 +15,9 @@ provides=('lunar-client' 'lunarclient')
|
|||||||
conflicts=('lunar-client' 'lunarclient')
|
conflicts=('lunar-client' 'lunarclient')
|
||||||
options=('!strip' '!debug')
|
options=('!strip' '!debug')
|
||||||
# maintained by CI together with pkgver (upstream varies the filename suffix)
|
# maintained by CI together with pkgver (upstream varies the filename suffix)
|
||||||
_appimage="Lunar%20Client-3.7.12-ow.AppImage"
|
_appimage="Lunar%20Client-3.7.17-ow.AppImage"
|
||||||
source=("${_pkgname}-${pkgver}.AppImage::https://launcherupdates.lunarclientcdn.com/${_appimage}")
|
source=("${_pkgname}-${pkgver}.AppImage::https://launcherupdates.lunarclientcdn.com/${_appimage}")
|
||||||
sha256sums=('7364e876a59291d8b0b7d6c0efdacb988617e35e054e9c21a5814d071710bf98')
|
sha256sums=('4d298f99de13941c37f044623c02687d59ad52cbcedb7eab5d5b297db1937470')
|
||||||
|
|
||||||
prepare() {
|
prepare() {
|
||||||
chmod +x "${_pkgname}-${pkgver}.AppImage"
|
chmod +x "${_pkgname}-${pkgver}.AppImage"
|
||||||
@@ -45,4 +45,16 @@ package() {
|
|||||||
|
|
||||||
install -dm755 "${pkgdir}/usr/bin"
|
install -dm755 "${pkgdir}/usr/bin"
|
||||||
ln -s "/opt/${_pkgname}/${_pkgname}.AppImage" "${pkgdir}/usr/bin/${_pkgname}"
|
ln -s "/opt/${_pkgname}/${_pkgname}.AppImage" "${pkgdir}/usr/bin/${_pkgname}"
|
||||||
|
|
||||||
|
# A custom licence has to ship its terms. Lunar Client publishes none in the
|
||||||
|
# AppImage, so what goes in is the reference to the terms it is used under.
|
||||||
|
install -Dm644 /dev/stdin "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE" <<'EOF'
|
||||||
|
Lunar Client is proprietary software, distributed by Moonsworth, LLC.
|
||||||
|
|
||||||
|
It is not covered by a free-software licence: use is governed by the terms
|
||||||
|
of service the vendor publishes, and redistribution of the AppImage this
|
||||||
|
package installs is not granted by them.
|
||||||
|
|
||||||
|
Terms of service: https://www.lunarclient.com/terms
|
||||||
|
EOF
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
pkgbase = middleclick-autoscroll
|
||||||
|
pkgdesc = Middle-click autoscroll in every application that supports it
|
||||||
|
pkgver = 1.7.0
|
||||||
|
pkgrel = 1
|
||||||
|
url = https://git.felo.gg/LoonixTools/middleclick-autoscroll
|
||||||
|
install = middleclick-autoscroll.install
|
||||||
|
arch = any
|
||||||
|
license = GPL-3.0-or-later
|
||||||
|
makedepends = gettext
|
||||||
|
makedepends = scdoc
|
||||||
|
depends = bash
|
||||||
|
depends = systemd
|
||||||
|
depends = coreutils
|
||||||
|
depends = gawk
|
||||||
|
depends = grep
|
||||||
|
depends = sed
|
||||||
|
depends = gettext
|
||||||
|
optdepends = flatpak: cover Flatpak applications too
|
||||||
|
optdepends = spotify-launcher: cover the official Spotify client
|
||||||
|
optdepends = steam: cover the Steam interface
|
||||||
|
optdepends = desktop-file-utils: refresh the desktop database after a change
|
||||||
|
source = middleclick-autoscroll-1.7.0.tar.gz::https://git.felo.gg/LoonixTools/middleclick-autoscroll/archive/v1.7.0.tar.gz
|
||||||
|
sha256sums = 2583f80d56effb0fefcb93b6623a6f8a6cfdcf31217b8ca283591a882f484ea2
|
||||||
|
|
||||||
|
pkgname = middleclick-autoscroll
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
# Maintainer: Felitendo
|
||||||
|
# This PKGBUILD is updated automatically:
|
||||||
|
# https://git.felo.gg/Felitendo/PKGBUILDS
|
||||||
|
|
||||||
|
pkgname=middleclick-autoscroll
|
||||||
|
pkgver=1.7.0
|
||||||
|
pkgrel=1
|
||||||
|
pkgdesc="Middle-click autoscroll in every application that supports it"
|
||||||
|
arch=('any')
|
||||||
|
url="https://git.felo.gg/LoonixTools/middleclick-autoscroll"
|
||||||
|
license=('GPL-3.0-or-later')
|
||||||
|
depends=('bash' 'systemd' 'coreutils' 'gawk' 'grep' 'sed' 'gettext')
|
||||||
|
makedepends=('gettext' 'scdoc')
|
||||||
|
optdepends=('flatpak: cover Flatpak applications too'
|
||||||
|
'spotify-launcher: cover the official Spotify client'
|
||||||
|
'steam: cover the Steam interface'
|
||||||
|
'desktop-file-utils: refresh the desktop database after a change')
|
||||||
|
install="${pkgname}.install"
|
||||||
|
source=("${pkgname}-${pkgver}.tar.gz::${url}/archive/v${pkgver}.tar.gz")
|
||||||
|
sha256sums=('2583f80d56effb0fefcb93b6623a6f8a6cfdcf31217b8ca283591a882f484ea2')
|
||||||
|
|
||||||
|
build() {
|
||||||
|
# pass the version being packaged so `middleclick-autoscroll --version`
|
||||||
|
# cannot drift away from pkgver
|
||||||
|
make -C "${pkgname}" VERSION="$pkgver"
|
||||||
|
}
|
||||||
|
|
||||||
|
package() {
|
||||||
|
make -C "${pkgname}" VERSION="$pkgver" DESTDIR="$pkgdir" install
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
post_install() {
|
||||||
|
cat <<'EOF'
|
||||||
|
|
||||||
|
middleclick-autoscroll is installed but not active yet.
|
||||||
|
|
||||||
|
middleclick-autoscroll interactive menu
|
||||||
|
middleclick-autoscroll enable turn autoscroll on everywhere
|
||||||
|
|
||||||
|
Run it as your own user, not with sudo: it only ever writes inside your own
|
||||||
|
home directory, and there is nothing to configure by hand.
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
post_upgrade() {
|
||||||
|
cat <<'EOF'
|
||||||
|
|
||||||
|
Run `middleclick-autoscroll apply` (or just open the menu) if the version
|
||||||
|
marker in your generated launcher entries should be refreshed.
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
pre_remove() {
|
||||||
|
# The changes live in each user's home directory and cannot be undone from a
|
||||||
|
# root-run hook, so say so while the command that does it still exists.
|
||||||
|
cat <<'EOF'
|
||||||
|
|
||||||
|
Before removing this package, run
|
||||||
|
|
||||||
|
middleclick-autoscroll disable
|
||||||
|
|
||||||
|
as each user that enabled it. That puts back every launcher entry, flag file
|
||||||
|
and Steam script it changed. Removing the package without it leaves those
|
||||||
|
changes in place with nothing left to undo them.
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
# middleclick-autoscroll - middle-click autoscroll for Chromium-based
|
||||||
|
# applications (https://git.felo.gg/LoonixTools/middleclick-autoscroll).
|
||||||
|
#
|
||||||
|
# Pure shell plus a gettext catalog and a scdoc man page, so the PKGBUILD just
|
||||||
|
# runs the upstream Makefile against the release tarball. Nothing is prebuilt
|
||||||
|
# and nothing is republished - the AUR package builds exactly what the tag
|
||||||
|
# contains.
|
||||||
|
|
||||||
|
UPSTREAM_REPO="LoonixTools/middleclick-autoscroll"
|
||||||
|
|
||||||
|
# Installed in CI (pacman) before the makepkg test build.
|
||||||
|
BUILD_DEPS=(gettext scdoc)
|
||||||
|
|
||||||
|
latest_version() {
|
||||||
|
# the highest vX.Y.Z tag; not every release has a release page
|
||||||
|
curl -sf "https://git.felo.gg/api/v1/repos/$UPSTREAM_REPO/tags?limit=50" \
|
||||||
|
| jq -r '.[].name | select(test("^v[0-9]+(\\.[0-9]+)*$"))' \
|
||||||
|
| sed 's/^v//' | sort -V | tail -n 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# refresh_checksums <version> <pkgbuild-path>
|
||||||
|
refresh_checksums() {
|
||||||
|
local ver="$1" pkgbuild="$2"
|
||||||
|
local sha
|
||||||
|
|
||||||
|
sha="$(curl -sfL "https://git.felo.gg/$UPSTREAM_REPO/archive/v$ver.tar.gz" \
|
||||||
|
| sha256sum | cut -d' ' -f1)"
|
||||||
|
|
||||||
|
sed -i "s|^sha256sums=.*|sha256sums=('$sha')|" "$pkgbuild"
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
pkgbase = modrinth-app-bin
|
pkgbase = modrinth-app-bin
|
||||||
pkgdesc = Minecraft mod manager and launcher from Modrinth (upstream binary)
|
pkgdesc = Minecraft mod manager and launcher from Modrinth (upstream binary)
|
||||||
pkgver = 0.15.20
|
pkgver = 0.21.6
|
||||||
pkgrel = 1
|
pkgrel = 1
|
||||||
url = https://modrinth.com/app
|
url = https://modrinth.com/app
|
||||||
arch = x86_64
|
arch = x86_64
|
||||||
@@ -10,10 +10,10 @@ pkgbase = modrinth-app-bin
|
|||||||
depends = hicolor-icon-theme
|
depends = hicolor-icon-theme
|
||||||
provides = modrinth-app
|
provides = modrinth-app
|
||||||
conflicts = modrinth-app
|
conflicts = modrinth-app
|
||||||
noextract = modrinth-app-bin-0.15.20.deb
|
noextract = modrinth-app-bin-0.21.6.deb
|
||||||
options = !strip
|
options = !strip
|
||||||
options = !debug
|
options = !debug
|
||||||
source = modrinth-app-bin-0.15.20.deb::https://github.com/modrinth/code/releases/download/v0.15.20/Modrinth.App_0.15.20_amd64.deb
|
source = modrinth-app-bin-0.21.6.deb::https://github.com/modrinth/code/releases/download/v0.21.6/Modrinth.App_0.21.6_amd64.deb
|
||||||
sha256sums = b88f8f4b5b2017ad99fb3e89cbfe1dc1a6693aa67c2edf7e94ee959a42fb533a
|
sha256sums = e38d00d06b50b248954d7d1e097c6e8c99cd122907e88e1fb6202452e73de629
|
||||||
|
|
||||||
pkgname = modrinth-app-bin
|
pkgname = modrinth-app-bin
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
# Maintainer: Felitendo
|
# Maintainer: Felitendo
|
||||||
# This PKGBUILD is updated automatically:
|
# This PKGBUILD is updated automatically:
|
||||||
# https://github.com/Felitendo/PKGBUILDS
|
# https://git.felo.gg/Felitendo/PKGBUILDS
|
||||||
|
|
||||||
pkgname=modrinth-app-bin
|
pkgname=modrinth-app-bin
|
||||||
pkgver=0.15.20
|
pkgver=0.21.6
|
||||||
pkgrel=1
|
pkgrel=1
|
||||||
pkgdesc="Minecraft mod manager and launcher from Modrinth (upstream binary)"
|
pkgdesc="Minecraft mod manager and launcher from Modrinth (upstream binary)"
|
||||||
arch=('x86_64')
|
arch=('x86_64')
|
||||||
@@ -15,7 +15,7 @@ conflicts=('modrinth-app')
|
|||||||
options=('!strip' '!debug')
|
options=('!strip' '!debug')
|
||||||
source=("${pkgname}-${pkgver}.deb::https://github.com/modrinth/code/releases/download/v${pkgver}/Modrinth.App_${pkgver}_amd64.deb")
|
source=("${pkgname}-${pkgver}.deb::https://github.com/modrinth/code/releases/download/v${pkgver}/Modrinth.App_${pkgver}_amd64.deb")
|
||||||
noextract=("${pkgname}-${pkgver}.deb")
|
noextract=("${pkgname}-${pkgver}.deb")
|
||||||
sha256sums=('b88f8f4b5b2017ad99fb3e89cbfe1dc1a6693aa67c2edf7e94ee959a42fb533a')
|
sha256sums=('e38d00d06b50b248954d7d1e097c6e8c99cd122907e88e1fb6202452e73de629')
|
||||||
|
|
||||||
package() {
|
package() {
|
||||||
bsdtar -xOf "$srcdir/${pkgname}-${pkgver}.deb" 'data.tar.*' \
|
bsdtar -xOf "$srcdir/${pkgname}-${pkgver}.deb" 'data.tar.*' \
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
pkgbase = modrinth-enhanced-bin
|
||||||
|
pkgdesc = Modrinth App without ads or telemetry, with offline and Ely.by accounts and Linux fixes (upstream binary)
|
||||||
|
pkgver = 0.21.6
|
||||||
|
pkgrel = 1
|
||||||
|
url = https://git.felo.gg/Felitendo/Modrinth-Enhanced
|
||||||
|
arch = x86_64
|
||||||
|
license = GPL-3.0-only
|
||||||
|
depends = cairo
|
||||||
|
depends = dbus
|
||||||
|
depends = gdk-pixbuf2
|
||||||
|
depends = glib2
|
||||||
|
depends = glibc
|
||||||
|
depends = gtk3
|
||||||
|
depends = hicolor-icon-theme
|
||||||
|
depends = libdrm
|
||||||
|
depends = libgcc
|
||||||
|
depends = libsoup3
|
||||||
|
depends = webkit2gtk-4.1
|
||||||
|
depends = libgl
|
||||||
|
depends = libpulse
|
||||||
|
depends = libx11
|
||||||
|
depends = libxcursor
|
||||||
|
depends = libxext
|
||||||
|
depends = libxxf86vm
|
||||||
|
optdepends = xorg-xrandr: for older Minecraft versions
|
||||||
|
provides = modrinth-enhanced
|
||||||
|
conflicts = modrinth-enhanced
|
||||||
|
noextract = modrinth-enhanced-bin-0.21.6.deb
|
||||||
|
options = !strip
|
||||||
|
options = !debug
|
||||||
|
source = modrinth-enhanced-bin-0.21.6.deb::https://git.felo.gg/Felitendo/Modrinth-Enhanced/releases/download/v0.21.6/Modrinth.Enhanced_0.21.6_amd64.deb
|
||||||
|
source = vblank-shim.c
|
||||||
|
source = modrinth-enhanced.sh
|
||||||
|
sha256sums = 229710df23441e8309c10580288c6c3f3151ed51b41a24e97eae474c6d0c829f
|
||||||
|
sha256sums = 0190921b8ff2fb1deec3209cba71c01541ca1f013e3ba41680f1636e185fd455
|
||||||
|
sha256sums = b24872f82645c52ee4804599cd678d138876fb193c754403fa9c5cf92bd745b9
|
||||||
|
|
||||||
|
pkgname = modrinth-enhanced-bin
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
# Maintainer: Felitendo
|
||||||
|
# This PKGBUILD is updated automatically:
|
||||||
|
# https://git.felo.gg/Felitendo/PKGBUILDS
|
||||||
|
|
||||||
|
pkgname=modrinth-enhanced-bin
|
||||||
|
pkgver=0.21.6
|
||||||
|
pkgrel=1
|
||||||
|
pkgdesc="Modrinth App without ads or telemetry, with offline and Ely.by accounts and Linux fixes (upstream binary)"
|
||||||
|
arch=('x86_64')
|
||||||
|
url="https://git.felo.gg/Felitendo/Modrinth-Enhanced"
|
||||||
|
license=('GPL-3.0-only')
|
||||||
|
depends=('cairo' 'dbus' 'gdk-pixbuf2' 'glib2' 'glibc' 'gtk3' 'hicolor-icon-theme'
|
||||||
|
'libdrm' 'libgcc' 'libsoup3' 'webkit2gtk-4.1'
|
||||||
|
# loaded by Minecraft, not by the launcher
|
||||||
|
'libgl' 'libpulse' 'libx11' 'libxcursor' 'libxext' 'libxxf86vm')
|
||||||
|
optdepends=('xorg-xrandr: for older Minecraft versions')
|
||||||
|
provides=('modrinth-enhanced')
|
||||||
|
conflicts=('modrinth-enhanced')
|
||||||
|
options=('!strip' '!debug')
|
||||||
|
# A new revision of the patches on the same Modrinth App release is tagged
|
||||||
|
# v0.21.2-2, which pkgver spells 0.21.2.r2; see pkg.sh.
|
||||||
|
_tag="v0.21.6"
|
||||||
|
_asset="Modrinth.Enhanced_0.21.6_amd64.deb"
|
||||||
|
# With the NVIDIA driver WebKitGTK paces the app with a 60 fps timer whatever
|
||||||
|
# the monitor's refresh rate. vblank-shim.c, preloaded by modrinth-enhanced.sh,
|
||||||
|
# paces it at the monitor's rate instead and keeps the app on X11, the only
|
||||||
|
# place that works; it is not part of upstream's release.
|
||||||
|
source=("${pkgname}-${pkgver}.deb::https://git.felo.gg/Felitendo/Modrinth-Enhanced/releases/download/${_tag}/${_asset}"
|
||||||
|
"vblank-shim.c"
|
||||||
|
"modrinth-enhanced.sh")
|
||||||
|
noextract=("${pkgname}-${pkgver}.deb")
|
||||||
|
sha256sums=('229710df23441e8309c10580288c6c3f3151ed51b41a24e97eae474c6d0c829f' '0190921b8ff2fb1deec3209cba71c01541ca1f013e3ba41680f1636e185fd455' 'b24872f82645c52ee4804599cd678d138876fb193c754403fa9c5cf92bd745b9')
|
||||||
|
|
||||||
|
build() {
|
||||||
|
# GLib for its headers only: the shim looks GTK and GLib up at run time
|
||||||
|
gcc $CPPFLAGS $CFLAGS $LDFLAGS -shared -fPIC -o libwebkit-vblank-shim.so vblank-shim.c \
|
||||||
|
$(pkg-config --cflags glib-2.0) $(pkg-config --cflags --libs libdrm)
|
||||||
|
}
|
||||||
|
|
||||||
|
package() {
|
||||||
|
bsdtar -xOf "$srcdir/${pkgname}-${pkgver}.deb" 'data.tar.*' \
|
||||||
|
| bsdtar -xpf - -C "$pkgdir" usr
|
||||||
|
|
||||||
|
# the binary moves behind the script that preloads the shim
|
||||||
|
install -d "$pkgdir/usr/lib/modrinth-enhanced"
|
||||||
|
mv "$pkgdir/usr/bin/ModrinthEnhanced" "$pkgdir/usr/lib/modrinth-enhanced/"
|
||||||
|
install -Dm755 libwebkit-vblank-shim.so -t "$pkgdir/usr/lib/modrinth-enhanced/"
|
||||||
|
install -Dm755 modrinth-enhanced.sh "$pkgdir/usr/bin/ModrinthEnhanced"
|
||||||
|
ln -s ModrinthEnhanced "$pkgdir/usr/bin/modrinth-enhanced"
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Starts Modrinth Enhanced with the vblank shim preloaded (see vblank-shim.c).
|
||||||
|
# With the NVIDIA driver the shim only lifts the frame rate under X11, so it is
|
||||||
|
# asked to keep GTK on X11 there. MODRINTH_VBLANK_SHIM=0 starts the app without.
|
||||||
|
if [ "${MODRINTH_VBLANK_SHIM:-1}" != 0 ]; then
|
||||||
|
[ -d /sys/module/nvidia_drm ] && export VBLANK_SHIM_GDK_BACKEND=x11
|
||||||
|
export LD_PRELOAD="/usr/lib/modrinth-enhanced/libwebkit-vblank-shim.so${LD_PRELOAD:+:$LD_PRELOAD}"
|
||||||
|
fi
|
||||||
|
exec /usr/lib/modrinth-enhanced/ModrinthEnhanced "$@"
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
# modrinth-enhanced-bin - Modrinth Enhanced (https://git.felo.gg/Felitendo/Modrinth-Enhanced),
|
||||||
|
# the Modrinth App (Tauri) with a series of patches applied: no ads, no
|
||||||
|
# telemetry, offline and Ely.by accounts, Linux fixes.
|
||||||
|
#
|
||||||
|
# Upstream publishes a bundled .deb per release, so the app is not built here:
|
||||||
|
# on a new version only pkgver, the tag, the asset name and the checksums are
|
||||||
|
# refreshed and the PKGBUILD repackages the deb directly. The only thing built
|
||||||
|
# is vblank-shim.c, which ships with this package (see the PKGBUILD).
|
||||||
|
#
|
||||||
|
# Releases are tagged after the Modrinth App release they are built on
|
||||||
|
# (v0.21.2). When the patches change without a new Modrinth App release, the
|
||||||
|
# rebuild is tagged as a revision (v0.21.2-2) while the app and its .deb keep
|
||||||
|
# the plain version. pkgver turns the hyphen into ".r" (0.21.2.r2), which
|
||||||
|
# pacman sorts after 0.21.2 and before 0.21.3, so no epoch is needed.
|
||||||
|
#
|
||||||
|
# Upstream's release workflow creates the release together with its assets
|
||||||
|
# only after all three platforms built, so /releases/latest never points at a
|
||||||
|
# release whose .deb is still missing.
|
||||||
|
|
||||||
|
UPSTREAM_REPO="Felitendo/Modrinth-Enhanced"
|
||||||
|
|
||||||
|
# Installed in CI before the makepkg test build, for the shim's headers.
|
||||||
|
BUILD_DEPS=(glib2 libdrm)
|
||||||
|
|
||||||
|
latest_version() {
|
||||||
|
curl -sf "https://git.felo.gg/api/v1/repos/$UPSTREAM_REPO/releases/latest" \
|
||||||
|
| jq -r '.tag_name' | sed 's/^v//; s/-/.r/'
|
||||||
|
}
|
||||||
|
|
||||||
|
# refresh_checksums <version> <pkgbuild-path>
|
||||||
|
refresh_checksums() {
|
||||||
|
local ver="$1" pkgbuild="$2"
|
||||||
|
local tag="v${ver/.r/-}" dir asset sha sha_shim sha_script
|
||||||
|
|
||||||
|
dir="$(dirname "$pkgbuild")"
|
||||||
|
sha_shim="$(sha256sum "$dir/vblank-shim.c" | cut -d' ' -f1)"
|
||||||
|
sha_script="$(sha256sum "$dir/modrinth-enhanced.sh" | cut -d' ' -f1)"
|
||||||
|
|
||||||
|
asset="$(curl -sf "https://git.felo.gg/api/v1/repos/$UPSTREAM_REPO/releases/tags/$tag" \
|
||||||
|
| jq -r '.assets[].name | select(endswith("_amd64.deb"))')"
|
||||||
|
if [[ -z "$asset" || "$asset" == *$'\n'* ]]; then
|
||||||
|
echo "could not find exactly one amd64 .deb in release $tag" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
sha="$(curl -sfL "https://git.felo.gg/$UPSTREAM_REPO/releases/download/$tag/$asset" \
|
||||||
|
| sha256sum | cut -d' ' -f1)"
|
||||||
|
|
||||||
|
sed -i \
|
||||||
|
-e "s|^_tag=.*|_tag=\"$tag\"|" \
|
||||||
|
-e "s|^_asset=.*|_asset=\"$asset\"|" \
|
||||||
|
-e "s|^sha256sums=.*|sha256sums=('$sha' '$sha_shim' '$sha_script')|" \
|
||||||
|
"$pkgbuild"
|
||||||
|
}
|
||||||
@@ -0,0 +1,437 @@
|
|||||||
|
// LD_PRELOAD shim that lets Modrinth Enhanced (WebKitGTK 4.1 on GTK3) draw at
|
||||||
|
// the monitor's refresh rate with the NVIDIA driver instead of 60 Hz.
|
||||||
|
//
|
||||||
|
// Three things hold it at 60 Hz there:
|
||||||
|
// 1. WebKitGTK looks for the DRM CRTC of the monitor a window is on by
|
||||||
|
// physical size, and the NVIDIA DRM connector reports slightly different
|
||||||
|
// millimetres than GDK does, so no CRTC is found.
|
||||||
|
// 2. The NVIDIA DRM driver does not implement DRM_IOCTL_WAIT_VBLANK, so even a
|
||||||
|
// found CRTC cannot be waited on. WebKit then paces with a 60 fps timer.
|
||||||
|
// 3. GTK3 paces its own paints from the refresh interval the display server
|
||||||
|
// reports, and assumes 60 Hz without one. KWin reports none to it, on X11
|
||||||
|
// (no _NET_WM_FRAME_TIMINGS for XWayland clients) and on Wayland alike.
|
||||||
|
//
|
||||||
|
// This shim:
|
||||||
|
// 1. corrects the connector size to what GDK reports for the same monitor,
|
||||||
|
// found by output name on X11 ("DP-1") or EDID model name on Wayland;
|
||||||
|
// 2. emulates blocking vblank waits at the CRTC's refresh rate when the
|
||||||
|
// driver refuses them;
|
||||||
|
// 3. fills in the monitor refresh interval on GTK3 frame timings that were
|
||||||
|
// left without one.
|
||||||
|
//
|
||||||
|
// Each step only stands in for what is missing, so with drivers that report
|
||||||
|
// all of it the shim changes nothing.
|
||||||
|
//
|
||||||
|
// The frame rate only comes through on X11: on Wayland something in GTK3 or
|
||||||
|
// WebKit still asks for 60 frames a second. VBLANK_SHIM_GDK_BACKEND=x11 keeps
|
||||||
|
// GTK on X11 without setting GDK_BACKEND, which every program the app starts
|
||||||
|
// would inherit. A GDK_BACKEND the user set still wins.
|
||||||
|
//
|
||||||
|
// Build: gcc -shared -fPIC -O2 -o libwebkit-vblank-shim.so vblank-shim.c $(pkg-config --cflags glib-2.0) $(pkg-config --cflags --libs libdrm)
|
||||||
|
// Debug: VBLANK_SHIM_DEBUG=1
|
||||||
|
// Knobs: VBLANK_SHIM_RATE_MULTIPLIER (vblank emulation), VBLANK_SHIM_REFRESH_HZ
|
||||||
|
// (GTK frame timings, default: fastest monitor), VBLANK_SHIM_FRAME_CLOCK=0
|
||||||
|
// (leave GTK frame timings alone)
|
||||||
|
|
||||||
|
#define _GNU_SOURCE
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <dlfcn.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <glib-object.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <xf86drm.h>
|
||||||
|
#include <xf86drmMode.h>
|
||||||
|
|
||||||
|
typedef struct _GdkDisplay GdkDisplay;
|
||||||
|
typedef struct _GdkMonitor GdkMonitor;
|
||||||
|
typedef struct _GdkWindow GdkWindow;
|
||||||
|
typedef struct _GdkFrameClock GdkFrameClock;
|
||||||
|
typedef struct _GdkFrameTimings GdkFrameTimings;
|
||||||
|
|
||||||
|
static int debug_enabled(void) {
|
||||||
|
static int value = -1;
|
||||||
|
if (value < 0) value = getenv("VBLANK_SHIM_DEBUG") != NULL;
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define debug(...) do { if (debug_enabled()) fprintf(stderr, "vblank-shim: " __VA_ARGS__); } while (0)
|
||||||
|
|
||||||
|
// --- 0. Window system -------------------------------------------------------
|
||||||
|
|
||||||
|
static char gdk_backend[16];
|
||||||
|
|
||||||
|
// Read on load, while nothing else runs, and taken out of the environment.
|
||||||
|
__attribute__((constructor))
|
||||||
|
static void take_gdk_backend(void) {
|
||||||
|
const char *backend = getenv("VBLANK_SHIM_GDK_BACKEND");
|
||||||
|
if (!backend) return;
|
||||||
|
snprintf(gdk_backend, sizeof gdk_backend, "%s", backend);
|
||||||
|
unsetenv("VBLANK_SHIM_GDK_BACKEND");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void select_gdk_backend(void) {
|
||||||
|
if (!gdk_backend[0] || getenv("GDK_BACKEND")) return;
|
||||||
|
void (*set_allowed_backends)(const char *) = dlsym(RTLD_DEFAULT, "gdk_set_allowed_backends");
|
||||||
|
if (set_allowed_backends) {
|
||||||
|
set_allowed_backends(gdk_backend);
|
||||||
|
debug("GDK limited to %s\n", gdk_backend);
|
||||||
|
}
|
||||||
|
gdk_backend[0] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
int gtk_init_check(int *argc, char ***argv) {
|
||||||
|
static int (*real)(int *, char ***);
|
||||||
|
if (!real) real = dlsym(RTLD_NEXT, "gtk_init_check");
|
||||||
|
select_gdk_backend();
|
||||||
|
return real(argc, argv);
|
||||||
|
}
|
||||||
|
|
||||||
|
void gtk_init(int *argc, char ***argv) {
|
||||||
|
static void (*real)(int *, char ***);
|
||||||
|
if (!real) real = dlsym(RTLD_NEXT, "gtk_init");
|
||||||
|
select_gdk_backend();
|
||||||
|
real(argc, argv);
|
||||||
|
}
|
||||||
|
|
||||||
|
// WebKit waits for vblank and GTK paints in the process the shim is preloaded
|
||||||
|
// into. Its children - WebKit's helper processes, and Minecraft started from
|
||||||
|
// the launcher - have no use for it, so it leaves LD_PRELOAD on load and keeps
|
||||||
|
// whatever else is in there.
|
||||||
|
__attribute__((constructor))
|
||||||
|
static void leave_ld_preload(void) {
|
||||||
|
const char *preload = getenv("LD_PRELOAD");
|
||||||
|
Dl_info info;
|
||||||
|
if (!preload || !dladdr((void *)leave_ld_preload, &info) || !info.dli_fname) return;
|
||||||
|
const char *self = strrchr(info.dli_fname, '/');
|
||||||
|
self = self ? self + 1 : info.dli_fname;
|
||||||
|
|
||||||
|
char *entries = strdup(preload), *kept = calloc(1, strlen(preload) + 1);
|
||||||
|
if (entries && kept) {
|
||||||
|
char *save = NULL;
|
||||||
|
for (char *entry = strtok_r(entries, ": ", &save); entry; entry = strtok_r(NULL, ": ", &save)) {
|
||||||
|
const char *name = strrchr(entry, '/');
|
||||||
|
if (strcmp(name ? name + 1 : entry, self) == 0) continue;
|
||||||
|
if (*kept) strcat(kept, ":");
|
||||||
|
strcat(kept, entry);
|
||||||
|
}
|
||||||
|
if (*kept) setenv("LD_PRELOAD", kept, 1);
|
||||||
|
else unsetenv("LD_PRELOAD");
|
||||||
|
}
|
||||||
|
free(entries);
|
||||||
|
free(kept);
|
||||||
|
}
|
||||||
|
|
||||||
|
// GTK and GLib are looked up at run time rather than linked, so the shim loads
|
||||||
|
// into processes without them (such as the shell script that starts the
|
||||||
|
// AppImage) and still finds them when they are loaded later with dlopen.
|
||||||
|
static struct {
|
||||||
|
GdkDisplay *(*display_get_default)(void);
|
||||||
|
int (*display_get_n_monitors)(GdkDisplay *);
|
||||||
|
GdkMonitor *(*display_get_monitor)(GdkDisplay *, int);
|
||||||
|
const char *(*monitor_get_model)(GdkMonitor *);
|
||||||
|
int (*monitor_get_width_mm)(GdkMonitor *);
|
||||||
|
int (*monitor_get_height_mm)(GdkMonitor *);
|
||||||
|
int (*monitor_get_refresh_rate)(GdkMonitor *);
|
||||||
|
GType (*frame_clock_get_type)(void);
|
||||||
|
GdkFrameTimings *(*frame_clock_get_current_timings)(GdkFrameClock *);
|
||||||
|
gint64 (*frame_timings_get_refresh_interval)(GdkFrameTimings *);
|
||||||
|
gpointer (*type_class_ref)(GType);
|
||||||
|
guint (*signal_lookup)(const gchar *, GType);
|
||||||
|
gulong (*signal_add_emission_hook)(guint, GQuark, GSignalEmissionHook, gpointer, GDestroyNotify);
|
||||||
|
gpointer (*value_get_object)(const GValue *);
|
||||||
|
} gtk;
|
||||||
|
|
||||||
|
static int gtk_resolved(void) {
|
||||||
|
if (gtk.value_get_object) return 1;
|
||||||
|
#define RESOLVE(field, name) if (!(gtk.field = dlsym(RTLD_DEFAULT, name))) return 0
|
||||||
|
RESOLVE(display_get_default, "gdk_display_get_default");
|
||||||
|
RESOLVE(display_get_n_monitors, "gdk_display_get_n_monitors");
|
||||||
|
RESOLVE(display_get_monitor, "gdk_display_get_monitor");
|
||||||
|
RESOLVE(monitor_get_model, "gdk_monitor_get_model");
|
||||||
|
RESOLVE(monitor_get_width_mm, "gdk_monitor_get_width_mm");
|
||||||
|
RESOLVE(monitor_get_height_mm, "gdk_monitor_get_height_mm");
|
||||||
|
RESOLVE(monitor_get_refresh_rate, "gdk_monitor_get_refresh_rate");
|
||||||
|
RESOLVE(frame_clock_get_type, "gdk_frame_clock_get_type");
|
||||||
|
RESOLVE(frame_clock_get_current_timings, "gdk_frame_clock_get_current_timings");
|
||||||
|
RESOLVE(frame_timings_get_refresh_interval, "gdk_frame_timings_get_refresh_interval");
|
||||||
|
RESOLVE(type_class_ref, "g_type_class_ref");
|
||||||
|
RESOLVE(signal_lookup, "g_signal_lookup");
|
||||||
|
RESOLVE(signal_add_emission_hook, "g_signal_add_emission_hook");
|
||||||
|
RESOLVE(value_get_object, "g_value_get_object");
|
||||||
|
#undef RESOLVE
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- 1. Connector size ------------------------------------------------------
|
||||||
|
|
||||||
|
static const char *connector_prefix(uint32_t type) {
|
||||||
|
switch (type) {
|
||||||
|
case DRM_MODE_CONNECTOR_DisplayPort: return "DP";
|
||||||
|
case DRM_MODE_CONNECTOR_HDMIA: return "HDMI-A";
|
||||||
|
case DRM_MODE_CONNECTOR_HDMIB: return "HDMI-B";
|
||||||
|
case DRM_MODE_CONNECTOR_DVID: return "DVI-D";
|
||||||
|
case DRM_MODE_CONNECTOR_DVII: return "DVI-I";
|
||||||
|
case DRM_MODE_CONNECTOR_eDP: return "eDP";
|
||||||
|
case DRM_MODE_CONNECTOR_VGA: return "VGA";
|
||||||
|
default: return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The monitor name descriptor (0xFC) of the connector's EDID, which is what
|
||||||
|
// GDK's Wayland backend reports as the monitor model.
|
||||||
|
static void edid_model_name(int fd, uint32_t connector_id, char *out, size_t size) {
|
||||||
|
out[0] = '\0';
|
||||||
|
drmModeObjectPropertiesPtr props = drmModeObjectGetProperties(fd, connector_id, DRM_MODE_OBJECT_CONNECTOR);
|
||||||
|
if (!props) return;
|
||||||
|
for (uint32_t i = 0; i < props->count_props && !out[0]; i++) {
|
||||||
|
drmModePropertyPtr prop = drmModeGetProperty(fd, props->props[i]);
|
||||||
|
if (prop && strcmp(prop->name, "EDID") == 0 && props->prop_values[i]) {
|
||||||
|
drmModePropertyBlobPtr blob = drmModeGetPropertyBlob(fd, props->prop_values[i]);
|
||||||
|
if (blob && blob->length >= 128) {
|
||||||
|
const unsigned char *edid = blob->data;
|
||||||
|
for (int d = 54; d <= 108; d += 18) {
|
||||||
|
if (edid[d] || edid[d + 1] || edid[d + 2] || edid[d + 3] != 0xFC) continue;
|
||||||
|
size_t n = 0;
|
||||||
|
for (int k = 5; k < 18 && n + 1 < size && edid[d + k] != '\n'; k++) out[n++] = edid[d + k];
|
||||||
|
while (n && isspace((unsigned char)out[n - 1])) n--;
|
||||||
|
out[n] = '\0';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
drmModeFreePropertyBlob(blob);
|
||||||
|
}
|
||||||
|
drmModeFreeProperty(prop);
|
||||||
|
}
|
||||||
|
drmModeFreeObjectProperties(props);
|
||||||
|
}
|
||||||
|
|
||||||
|
drmModeConnectorPtr drmModeGetConnector(int fd, uint32_t connector_id) {
|
||||||
|
static drmModeConnectorPtr (*real)(int, uint32_t);
|
||||||
|
if (!real) real = dlsym(RTLD_NEXT, "drmModeGetConnector");
|
||||||
|
drmModeConnectorPtr connector = real(fd, connector_id);
|
||||||
|
if (!connector || connector->connection != DRM_MODE_CONNECTED || !gtk_resolved()) return connector;
|
||||||
|
|
||||||
|
GdkDisplay *display = gtk.display_get_default();
|
||||||
|
if (!display) return connector;
|
||||||
|
|
||||||
|
char output_name[32] = "";
|
||||||
|
const char *prefix = connector_prefix(connector->connector_type);
|
||||||
|
if (prefix) snprintf(output_name, sizeof output_name, "%s-%u", prefix, connector->connector_type_id);
|
||||||
|
char edid_name[32];
|
||||||
|
edid_model_name(fd, connector_id, edid_name, sizeof edid_name);
|
||||||
|
|
||||||
|
for (int i = 0; i < gtk.display_get_n_monitors(display); i++) {
|
||||||
|
GdkMonitor *monitor = gtk.display_get_monitor(display, i);
|
||||||
|
const char *model = gtk.monitor_get_model(monitor);
|
||||||
|
if (!model) continue;
|
||||||
|
if (!(output_name[0] && strcmp(model, output_name) == 0) && !(edid_name[0] && strcmp(model, edid_name) == 0))
|
||||||
|
continue;
|
||||||
|
int w = gtk.monitor_get_width_mm(monitor), h = gtk.monitor_get_height_mm(monitor);
|
||||||
|
if (w > 0 && h > 0 && ((uint32_t)w != connector->mmWidth || (uint32_t)h != connector->mmHeight)) {
|
||||||
|
debug("%s (%s): connector size %ux%u mm -> %dx%d mm (as GDK reports)\n", output_name, edid_name,
|
||||||
|
connector->mmWidth, connector->mmHeight, w, h);
|
||||||
|
connector->mmWidth = w;
|
||||||
|
connector->mmHeight = h;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return connector;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- 2. Vblank emulation ----------------------------------------------------
|
||||||
|
|
||||||
|
struct emulated_crtc {
|
||||||
|
int fd;
|
||||||
|
unsigned index;
|
||||||
|
long long period_ns;
|
||||||
|
struct timespec base;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct emulated_crtc crtcs[16];
|
||||||
|
static int crtc_count;
|
||||||
|
static pthread_mutex_t crtcs_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
|
||||||
|
static long long to_ns(const struct timespec *t) {
|
||||||
|
return (long long)t->tv_sec * 1000000000LL + t->tv_nsec;
|
||||||
|
}
|
||||||
|
|
||||||
|
static double rate_multiplier(void) {
|
||||||
|
const char *value = getenv("VBLANK_SHIM_RATE_MULTIPLIER");
|
||||||
|
double multiplier = value ? atof(value) : 1.0;
|
||||||
|
return multiplier >= 1.0 ? multiplier : 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static long long refresh_period_ns(int fd, unsigned index) {
|
||||||
|
long long period = (long long)(1e9 / (60 * rate_multiplier()));
|
||||||
|
drmModeResPtr resources = drmModeGetResources(fd);
|
||||||
|
if (!resources) return period;
|
||||||
|
if ((int)index < resources->count_crtcs) {
|
||||||
|
drmModeCrtcPtr crtc = drmModeGetCrtc(fd, resources->crtcs[index]);
|
||||||
|
if (crtc && crtc->mode_valid && crtc->mode.htotal && crtc->mode.vtotal) {
|
||||||
|
const drmModeModeInfo *mode = &crtc->mode;
|
||||||
|
double hz = mode->clock * 1000.0 / ((double)mode->htotal * mode->vtotal);
|
||||||
|
if (mode->flags & DRM_MODE_FLAG_INTERLACE) hz *= 2;
|
||||||
|
if (mode->flags & DRM_MODE_FLAG_DBLSCAN) hz /= 2;
|
||||||
|
if (mode->vscan > 1) hz /= mode->vscan;
|
||||||
|
if (hz > 1) period = (long long)(1e9 / (hz * rate_multiplier()));
|
||||||
|
debug("emulating vblank for crtc index %u at %.3f Hz x %.1f\n", index, hz, rate_multiplier());
|
||||||
|
}
|
||||||
|
drmModeFreeCrtc(crtc);
|
||||||
|
}
|
||||||
|
drmModeFreeResources(resources);
|
||||||
|
return period;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct emulated_crtc *emulated_crtc_for(int fd, unsigned index) {
|
||||||
|
pthread_mutex_lock(&crtcs_lock);
|
||||||
|
struct emulated_crtc *found = NULL;
|
||||||
|
for (int i = 0; i < crtc_count; i++) {
|
||||||
|
if (crtcs[i].fd == fd && crtcs[i].index == index) {
|
||||||
|
found = &crtcs[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found && crtc_count < (int)(sizeof crtcs / sizeof crtcs[0])) {
|
||||||
|
found = &crtcs[crtc_count++];
|
||||||
|
found->fd = fd;
|
||||||
|
found->index = index;
|
||||||
|
found->period_ns = refresh_period_ns(fd, index);
|
||||||
|
clock_gettime(CLOCK_MONOTONIC, &found->base);
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock(&crtcs_lock);
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
|
int drmWaitVBlank(int fd, drmVBlankPtr vbl) {
|
||||||
|
static int (*real)(int, drmVBlankPtr);
|
||||||
|
if (!real) real = dlsym(RTLD_NEXT, "drmWaitVBlank");
|
||||||
|
|
||||||
|
drmVBlankReq request = vbl->request;
|
||||||
|
int ret = real(fd, vbl);
|
||||||
|
if (ret == 0) return 0;
|
||||||
|
|
||||||
|
int error = errno;
|
||||||
|
// Only stand in for a driver that does not do vblank waits at all, and only
|
||||||
|
// for plain blocking waits.
|
||||||
|
if ((error != EOPNOTSUPP && error != EPERM) || (request.type & (DRM_VBLANK_EVENT | DRM_VBLANK_SIGNAL))) {
|
||||||
|
errno = error;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned index = (request.type & DRM_VBLANK_SECONDARY)
|
||||||
|
? 1
|
||||||
|
: (request.type & DRM_VBLANK_HIGH_CRTC_MASK) >> DRM_VBLANK_HIGH_CRTC_SHIFT;
|
||||||
|
struct emulated_crtc *crtc = emulated_crtc_for(fd, index);
|
||||||
|
if (!crtc) {
|
||||||
|
errno = error;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct timespec now;
|
||||||
|
clock_gettime(CLOCK_MONOTONIC, &now);
|
||||||
|
long long base = to_ns(&crtc->base);
|
||||||
|
long long current = (to_ns(&now) - base) / crtc->period_ns;
|
||||||
|
long long target;
|
||||||
|
if (request.type & DRM_VBLANK_RELATIVE) {
|
||||||
|
target = current + request.sequence;
|
||||||
|
} else {
|
||||||
|
target = request.sequence;
|
||||||
|
if (target <= current && (request.type & DRM_VBLANK_NEXTONMISS)) target = current + 1;
|
||||||
|
}
|
||||||
|
if (target < current) target = current;
|
||||||
|
|
||||||
|
long long when = base + target * crtc->period_ns;
|
||||||
|
if (target > current) {
|
||||||
|
struct timespec until = { when / 1000000000LL, when % 1000000000LL };
|
||||||
|
while (clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &until, NULL) == EINTR) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
vbl->reply.type = request.type;
|
||||||
|
vbl->reply.sequence = (unsigned)target;
|
||||||
|
vbl->reply.tval_sec = when / 1000000000LL;
|
||||||
|
vbl->reply.tval_usec = (when % 1000000000LL) / 1000;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- 3. GTK3 frame timings --------------------------------------------------
|
||||||
|
|
||||||
|
static gint64 frame_refresh_interval_us;
|
||||||
|
// Offset of the refresh_interval field inside GdkFrameTimings, found through
|
||||||
|
// the public getter rather than assumed. -1: not found yet, -2: give up.
|
||||||
|
static long refresh_interval_offset = -1;
|
||||||
|
|
||||||
|
static gint64 monitor_refresh_interval_us(void) {
|
||||||
|
const char *forced = getenv("VBLANK_SHIM_REFRESH_HZ");
|
||||||
|
if (forced && atof(forced) > 1) return (gint64)(1e6 / atof(forced));
|
||||||
|
GdkDisplay *display = gtk.display_get_default();
|
||||||
|
if (!display) return 0;
|
||||||
|
int fastest = 0;
|
||||||
|
for (int i = 0; i < gtk.display_get_n_monitors(display); i++) {
|
||||||
|
int rate = gtk.monitor_get_refresh_rate(gtk.display_get_monitor(display, i));
|
||||||
|
if (rate > fastest) fastest = rate;
|
||||||
|
}
|
||||||
|
// GDK reports milli-hertz.
|
||||||
|
return fastest > 0 ? (gint64)(1000000000LL / fastest) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static long find_refresh_interval_offset(GdkFrameTimings *timings) {
|
||||||
|
gint64 *slots = (gint64 *)timings;
|
||||||
|
// The struct starts with a guint ref_count; the gint64 fields follow it.
|
||||||
|
for (long offset = 8; offset <= 96; offset += 8) {
|
||||||
|
gint64 saved = slots[offset / 8];
|
||||||
|
slots[offset / 8] = 0x5eed5eed5eedLL;
|
||||||
|
gboolean match = gtk.frame_timings_get_refresh_interval(timings) == 0x5eed5eed5eedLL;
|
||||||
|
slots[offset / 8] = saved;
|
||||||
|
if (match) return offset;
|
||||||
|
}
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean after_paint_hook(GSignalInvocationHint *hint, guint n_params, const GValue *params, gpointer data) {
|
||||||
|
(void)hint;
|
||||||
|
(void)data;
|
||||||
|
if (n_params < 1 || refresh_interval_offset == -2) return TRUE;
|
||||||
|
GdkFrameTimings *timings = gtk.frame_clock_get_current_timings(gtk.value_get_object(¶ms[0]));
|
||||||
|
// Only frames the backend left without a refresh interval.
|
||||||
|
if (!timings || gtk.frame_timings_get_refresh_interval(timings) != 0) return TRUE;
|
||||||
|
|
||||||
|
if (!frame_refresh_interval_us) frame_refresh_interval_us = monitor_refresh_interval_us();
|
||||||
|
if (frame_refresh_interval_us <= 0) return TRUE;
|
||||||
|
if (refresh_interval_offset == -1) {
|
||||||
|
refresh_interval_offset = find_refresh_interval_offset(timings);
|
||||||
|
if (refresh_interval_offset < 0) {
|
||||||
|
debug("could not locate refresh_interval in GdkFrameTimings, leaving GTK alone\n");
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
debug("GTK frame timings: refresh interval %" G_GINT64_FORMAT " us (offset %ld)\n",
|
||||||
|
frame_refresh_interval_us, refresh_interval_offset);
|
||||||
|
}
|
||||||
|
((gint64 *)timings)[refresh_interval_offset / 8] = frame_refresh_interval_us;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void install_frame_clock_hook(void) {
|
||||||
|
const char *enabled = getenv("VBLANK_SHIM_FRAME_CLOCK");
|
||||||
|
if (enabled && strcmp(enabled, "0") == 0) return;
|
||||||
|
if (!gtk_resolved()) return;
|
||||||
|
GType type = gtk.frame_clock_get_type();
|
||||||
|
gtk.type_class_ref(type); // signals exist once the class does; keep it alive
|
||||||
|
guint signal = gtk.signal_lookup("after-paint", type);
|
||||||
|
if (!signal) return;
|
||||||
|
gtk.signal_add_emission_hook(signal, 0, after_paint_hook, NULL, NULL);
|
||||||
|
debug("installed GTK after-paint hook\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
GdkFrameClock *gdk_window_get_frame_clock(GdkWindow *window) {
|
||||||
|
static GdkFrameClock *(*real)(GdkWindow *);
|
||||||
|
static pthread_once_t once = PTHREAD_ONCE_INIT;
|
||||||
|
if (!real) real = dlsym(RTLD_NEXT, "gdk_window_get_frame_clock");
|
||||||
|
GdkFrameClock *clock = real(window);
|
||||||
|
if (clock) pthread_once(&once, install_frame_clock_hook);
|
||||||
|
return clock;
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
pkgbase = modrinth-enhanced
|
||||||
|
pkgdesc = Modrinth App without ads or telemetry, with offline and Ely.by accounts and Linux fixes
|
||||||
|
pkgver = 0.21.6
|
||||||
|
pkgrel = 1
|
||||||
|
url = https://git.felo.gg/Felitendo/Modrinth-Enhanced
|
||||||
|
arch = x86_64
|
||||||
|
license = GPL-3.0-only
|
||||||
|
makedepends = cargo
|
||||||
|
makedepends = git
|
||||||
|
makedepends = jdk17-openjdk
|
||||||
|
makedepends = node-gyp
|
||||||
|
makedepends = nodejs>=24.15.0
|
||||||
|
makedepends = npm
|
||||||
|
makedepends = pnpm
|
||||||
|
depends = cairo
|
||||||
|
depends = dbus
|
||||||
|
depends = gdk-pixbuf2
|
||||||
|
depends = glib2
|
||||||
|
depends = glibc
|
||||||
|
depends = gtk3
|
||||||
|
depends = hicolor-icon-theme
|
||||||
|
depends = libdrm
|
||||||
|
depends = libgcc
|
||||||
|
depends = libsoup3
|
||||||
|
depends = webkit2gtk-4.1
|
||||||
|
depends = libgl
|
||||||
|
depends = libpulse
|
||||||
|
depends = libx11
|
||||||
|
depends = libxcursor
|
||||||
|
depends = libxext
|
||||||
|
depends = libxxf86vm
|
||||||
|
optdepends = xorg-xrandr: for older Minecraft versions
|
||||||
|
noextract = modrinth-code-v0.21.6.tar.gz
|
||||||
|
options = !lto
|
||||||
|
options = !debug
|
||||||
|
source = modrinth-enhanced-v0.21.6.tar.gz::https://git.felo.gg/Felitendo/Modrinth-Enhanced/archive/v0.21.6.tar.gz
|
||||||
|
source = modrinth-code-v0.21.6.tar.gz::https://github.com/modrinth/code/archive/refs/tags/v0.21.6.tar.gz
|
||||||
|
source = vblank-shim.c
|
||||||
|
source = modrinth-enhanced.sh
|
||||||
|
sha256sums = 0bf2326e345ba2c6f25a6954538d20b4b63d7010ccdd54281186bac1196ef493
|
||||||
|
sha256sums = dd058ca164096a0f9aeeffec5dfa7905979719a33976643895806b0c82b6f409
|
||||||
|
sha256sums = 0190921b8ff2fb1deec3209cba71c01541ca1f013e3ba41680f1636e185fd455
|
||||||
|
sha256sums = b24872f82645c52ee4804599cd678d138876fb193c754403fa9c5cf92bd745b9
|
||||||
|
|
||||||
|
pkgname = modrinth-enhanced
|
||||||
@@ -0,0 +1,142 @@
|
|||||||
|
# Maintainer: Felitendo
|
||||||
|
# This PKGBUILD is updated automatically:
|
||||||
|
# https://git.felo.gg/Felitendo/PKGBUILDS
|
||||||
|
|
||||||
|
pkgname=modrinth-enhanced
|
||||||
|
pkgver=0.21.6
|
||||||
|
pkgrel=1
|
||||||
|
pkgdesc="Modrinth App without ads or telemetry, with offline and Ely.by accounts and Linux fixes"
|
||||||
|
arch=('x86_64')
|
||||||
|
url="https://git.felo.gg/Felitendo/Modrinth-Enhanced"
|
||||||
|
license=('GPL-3.0-only')
|
||||||
|
depends=('cairo' 'dbus' 'gdk-pixbuf2' 'glib2' 'glibc' 'gtk3' 'hicolor-icon-theme'
|
||||||
|
'libdrm' 'libgcc' 'libsoup3' 'webkit2gtk-4.1'
|
||||||
|
# loaded by Minecraft, not by the launcher
|
||||||
|
'libgl' 'libpulse' 'libx11' 'libxcursor' 'libxext' 'libxxf86vm')
|
||||||
|
# git replays the patches the way upstream's scripts/prepare.sh does; the JDK
|
||||||
|
# builds the Java agent, whose Gradle toolchain asks for exactly 17
|
||||||
|
makedepends=('cargo' 'git' 'jdk17-openjdk' 'node-gyp' 'nodejs>=24.15.0' 'npm' 'pnpm')
|
||||||
|
optdepends=('xorg-xrandr: for older Minecraft versions')
|
||||||
|
# the release profile carries no debug info, so a -debug package would be empty
|
||||||
|
options=('!lto' '!debug')
|
||||||
|
# Modrinth Enhanced holds no forked source, only patches. Its release tag
|
||||||
|
# records the Modrinth App release it was built on (upstream.txt) and the one
|
||||||
|
# the patches were exported against (patches/base.txt); pkg.sh reads both.
|
||||||
|
# A new revision of the patches on the same release is tagged v0.21.2-2, which
|
||||||
|
# pkgver spells 0.21.2.r2.
|
||||||
|
_tag="v0.21.6"
|
||||||
|
_upstream="v0.21.6"
|
||||||
|
_base="v0.21.6"
|
||||||
|
# With the NVIDIA driver WebKitGTK paces the app with a 60 fps timer whatever
|
||||||
|
# the monitor's refresh rate. vblank-shim.c, preloaded by modrinth-enhanced.sh,
|
||||||
|
# paces it at the monitor's rate instead and keeps the app on X11, the only
|
||||||
|
# place that works; it is not part of upstream's release.
|
||||||
|
source=("${pkgname}-${_tag}.tar.gz::https://git.felo.gg/Felitendo/Modrinth-Enhanced/archive/${_tag}.tar.gz"
|
||||||
|
"modrinth-code-${_upstream}.tar.gz::https://github.com/modrinth/code/archive/refs/tags/${_upstream}.tar.gz"
|
||||||
|
"vblank-shim.c"
|
||||||
|
"modrinth-enhanced.sh")
|
||||||
|
noextract=("modrinth-code-${_upstream}.tar.gz")
|
||||||
|
if [[ "$_base" != "$_upstream" ]]; then
|
||||||
|
source+=("modrinth-code-${_base}.tar.gz::https://github.com/modrinth/code/archive/refs/tags/${_base}.tar.gz")
|
||||||
|
noextract+=("modrinth-code-${_base}.tar.gz")
|
||||||
|
fi
|
||||||
|
sha256sums=('0bf2326e345ba2c6f25a6954538d20b4b63d7010ccdd54281186bac1196ef493' 'dd058ca164096a0f9aeeffec5dfa7905979719a33976643895806b0c82b6f409' '0190921b8ff2fb1deec3209cba71c01541ca1f013e3ba41680f1636e185fd455' 'b24872f82645c52ee4804599cd678d138876fb193c754403fa9c5cf92bd745b9')
|
||||||
|
|
||||||
|
prepare() {
|
||||||
|
# What upstream's scripts/prepare.sh does with two shallow tags: apply the
|
||||||
|
# patches to the release they were exported against, where they always fit,
|
||||||
|
# then rebase them onto the release this version was built on, so that a
|
||||||
|
# change upstream made near a patch is merged instead of failing to apply.
|
||||||
|
export GIT_CONFIG_GLOBAL=/dev/null GIT_CONFIG_NOSYSTEM=1
|
||||||
|
export GIT_AUTHOR_NAME="Modrinth Enhanced" GIT_AUTHOR_EMAIL="patches@modrinth-enhanced.invalid"
|
||||||
|
export GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME" GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"
|
||||||
|
|
||||||
|
rm -rf app
|
||||||
|
mkdir app
|
||||||
|
cd app
|
||||||
|
git init -q
|
||||||
|
# reset --hard checks the tree out again with upstream's .gitattributes
|
||||||
|
# applied, as a clone of the tag would have it
|
||||||
|
bsdtar -xf "$srcdir/modrinth-code-${_base}.tar.gz" --strip-components 1
|
||||||
|
git add -Af
|
||||||
|
git commit -qm "Modrinth App ${_base}"
|
||||||
|
git reset -q --hard
|
||||||
|
git tag base
|
||||||
|
if [[ "$_base" != "$_upstream" ]]; then
|
||||||
|
git rm -rqf .
|
||||||
|
bsdtar -xf "$srcdir/modrinth-code-${_upstream}.tar.gz" --strip-components 1
|
||||||
|
git add -Af
|
||||||
|
git commit -qm "Modrinth App ${_upstream}"
|
||||||
|
git reset -q --hard
|
||||||
|
git tag upstream
|
||||||
|
git checkout -q -b enhanced base
|
||||||
|
fi
|
||||||
|
git am -q --3way --whitespace=nowarn "$srcdir/modrinth-enhanced/patches/"*.patch
|
||||||
|
if [[ "$_base" != "$_upstream" ]]; then
|
||||||
|
git rebase -q --onto upstream base enhanced
|
||||||
|
fi
|
||||||
|
|
||||||
|
# upstream's scripts/set-version.sh: the sources carry 1.0.0-local, the app
|
||||||
|
# reports the Modrinth App release it is built on
|
||||||
|
sed -i "s/1.0.0-local/${_upstream#v}/" \
|
||||||
|
apps/app/Cargo.toml packages/app-lib/Cargo.toml apps/app-frontend/package.json Cargo.lock
|
||||||
|
|
||||||
|
# the production API endpoints, as upstream's scripts/build.sh selects them
|
||||||
|
cp packages/app-lib/.env.prod packages/app-lib/.env
|
||||||
|
|
||||||
|
# node-gyp for the native modules
|
||||||
|
export NODE_PATH=/usr/lib/node_modules
|
||||||
|
export TURBO_TELEMETRY_DISABLED=1
|
||||||
|
pnpm install --frozen-lockfile
|
||||||
|
|
||||||
|
export RUSTUP_TOOLCHAIN=stable
|
||||||
|
cargo fetch --locked --target host-tuple
|
||||||
|
}
|
||||||
|
|
||||||
|
build() {
|
||||||
|
# GLib for its headers only: the shim looks GTK and GLib up at run time
|
||||||
|
gcc $CPPFLAGS $CFLAGS $LDFLAGS -shared -fPIC -o libwebkit-vblank-shim.so vblank-shim.c \
|
||||||
|
$(pkg-config --cflags glib-2.0) $(pkg-config --cflags --libs libdrm)
|
||||||
|
|
||||||
|
cd app
|
||||||
|
|
||||||
|
export RUSTUP_TOOLCHAIN=stable
|
||||||
|
export NODE_PATH=/usr/lib/node_modules
|
||||||
|
export TURBO_TELEMETRY_DISABLED=1
|
||||||
|
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
|
||||||
|
# keep Gradle's cache inside the build tree instead of ~/.gradle
|
||||||
|
export GRADLE_USER_HOME="$srcdir/gradle-home"
|
||||||
|
|
||||||
|
# Without tauri-release.conf.json, as upstream builds it: that config only
|
||||||
|
# adds Modrinth's own updater. app-lib's build script runs Gradle, which
|
||||||
|
# downloads itself and the agent's dependencies, so build() needs network.
|
||||||
|
pnpm --filter=@modrinth/app run tauri build --no-bundle
|
||||||
|
}
|
||||||
|
|
||||||
|
package() {
|
||||||
|
cd app
|
||||||
|
|
||||||
|
# the same files, under the same names, as modrinth-enhanced-bin: the binary
|
||||||
|
# sits behind the script that preloads the shim
|
||||||
|
install -Dm755 target/release/ModrinthEnhanced -t "$pkgdir/usr/lib/modrinth-enhanced/"
|
||||||
|
install -Dm755 "$srcdir/libwebkit-vblank-shim.so" -t "$pkgdir/usr/lib/modrinth-enhanced/"
|
||||||
|
install -Dm755 "$srcdir/modrinth-enhanced.sh" "$pkgdir/usr/bin/ModrinthEnhanced"
|
||||||
|
ln -s ModrinthEnhanced "$pkgdir/usr/bin/modrinth-enhanced"
|
||||||
|
|
||||||
|
install -Dm644 apps/app/icons/128x128.png \
|
||||||
|
"$pkgdir/usr/share/icons/hicolor/128x128/apps/ModrinthEnhanced.png"
|
||||||
|
install -Dm644 apps/app/icons/128x128@2x.png \
|
||||||
|
"$pkgdir/usr/share/icons/hicolor/256x256@2/apps/ModrinthEnhanced.png"
|
||||||
|
|
||||||
|
install -d "$pkgdir/usr/share/applications"
|
||||||
|
cat > "$pkgdir/usr/share/applications/Modrinth Enhanced.desktop" << EOF
|
||||||
|
[Desktop Entry]
|
||||||
|
Categories=Game;
|
||||||
|
Exec=ModrinthEnhanced
|
||||||
|
Icon=ModrinthEnhanced
|
||||||
|
Name=Modrinth Enhanced
|
||||||
|
Terminal=false
|
||||||
|
Type=Application
|
||||||
|
MimeType=application/x-modrinth-modpack+zip;x-scheme-handler/modrinth
|
||||||
|
EOF
|
||||||
|
}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
../modrinth-enhanced-bin/modrinth-enhanced.sh
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
# modrinth-enhanced - Modrinth Enhanced (https://git.felo.gg/Felitendo/Modrinth-Enhanced),
|
||||||
|
# the Modrinth App (Tauri) with a series of patches applied: no ads, no
|
||||||
|
# telemetry, offline and Ely.by accounts, Linux fixes.
|
||||||
|
#
|
||||||
|
# Source package: upstream is not a fork but a patch series on top of a
|
||||||
|
# modrinth/code release tag. The PKGBUILD takes the patches from the Modrinth
|
||||||
|
# Enhanced release tag, applies them to the modrinth/code tarballs the same way
|
||||||
|
# upstream's scripts/prepare.sh does and builds the result like
|
||||||
|
# scripts/build.sh - the binary upstream wraps into the .deb that
|
||||||
|
# modrinth-enhanced-bin repackages.
|
||||||
|
#
|
||||||
|
# Two modrinth/code releases are pinned per version, both read from the
|
||||||
|
# release tag: upstream.txt is the release it was built on, patches/base.txt
|
||||||
|
# the one the patches were last exported against. They differ until the
|
||||||
|
# patches are exported again after Modrinth ships a release; the PKGBUILD then
|
||||||
|
# downloads both and rebases the patches from one onto the other.
|
||||||
|
#
|
||||||
|
# Release/version handling is identical to modrinth-enhanced-bin: a revision
|
||||||
|
# of the patches is tagged v0.21.2-2 and becomes pkgver 0.21.2.r2. See
|
||||||
|
# modrinth-enhanced-bin/pkg.sh.
|
||||||
|
|
||||||
|
UPSTREAM_REPO="Felitendo/Modrinth-Enhanced"
|
||||||
|
|
||||||
|
# Installed in CI (pacman) before the makepkg test build. makepkg runs with
|
||||||
|
# -d there, so the libraries the binary links against are listed too.
|
||||||
|
BUILD_DEPS=(rust git jdk17-openjdk node-gyp nodejs npm pnpm webkit2gtk-4.1 gtk3 libsoup3 libdrm)
|
||||||
|
|
||||||
|
latest_version() {
|
||||||
|
curl -sf "https://git.felo.gg/api/v1/repos/$UPSTREAM_REPO/releases/latest" \
|
||||||
|
| jq -r '.tag_name' | sed 's/^v//; s/-/.r/'
|
||||||
|
}
|
||||||
|
|
||||||
|
# read_tag_file <tag> <path> - a file of the release tag, whitespace stripped
|
||||||
|
read_tag_file() {
|
||||||
|
curl -sf "https://git.felo.gg/$UPSTREAM_REPO/raw/tag/$1/$2" \
|
||||||
|
| tr -d '[:space:]'
|
||||||
|
}
|
||||||
|
|
||||||
|
# refresh_checksums <version> <pkgbuild-path>
|
||||||
|
refresh_checksums() {
|
||||||
|
local ver="$1" pkgbuild="$2"
|
||||||
|
local tag="v${ver/.r/-}" upstream base sha_patches sha_upstream sums
|
||||||
|
|
||||||
|
upstream="$(read_tag_file "$tag" upstream.txt)"
|
||||||
|
# like upstream's patch_base(): without base.txt the patches fit upstream.txt
|
||||||
|
base="$(read_tag_file "$tag" patches/base.txt)" || base="$upstream"
|
||||||
|
if [[ ! "$upstream" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ || ! "$base" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
||||||
|
echo "could not resolve the Modrinth App releases of $tag (upstream: $upstream, base: $base)" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
sha_patches="$(curl -sfL "https://git.felo.gg/$UPSTREAM_REPO/archive/$tag.tar.gz" \
|
||||||
|
| sha256sum | cut -d' ' -f1)"
|
||||||
|
sha_upstream="$(curl -sfL "https://github.com/modrinth/code/archive/refs/tags/$upstream.tar.gz" \
|
||||||
|
| sha256sum | cut -d' ' -f1)"
|
||||||
|
# vblank-shim.c and modrinth-enhanced.sh ship with the package, as symlinks
|
||||||
|
# to modrinth-enhanced-bin's copies; they come before the optional base tag
|
||||||
|
sums="'$sha_patches' '$sha_upstream'"
|
||||||
|
sums+=" '$(sha256sum "$(dirname "$pkgbuild")/vblank-shim.c" | cut -d' ' -f1)'"
|
||||||
|
sums+=" '$(sha256sum "$(dirname "$pkgbuild")/modrinth-enhanced.sh" | cut -d' ' -f1)'"
|
||||||
|
if [[ "$base" != "$upstream" ]]; then
|
||||||
|
sums+=" '$(curl -sfL "https://github.com/modrinth/code/archive/refs/tags/$base.tar.gz" \
|
||||||
|
| sha256sum | cut -d' ' -f1)'"
|
||||||
|
fi
|
||||||
|
|
||||||
|
sed -i \
|
||||||
|
-e "s|^_tag=.*|_tag=\"$tag\"|" \
|
||||||
|
-e "s|^_upstream=.*|_upstream=\"$upstream\"|" \
|
||||||
|
-e "s|^_base=.*|_base=\"$base\"|" \
|
||||||
|
-e "s|^sha256sums=.*|sha256sums=($sums)|" \
|
||||||
|
"$pkgbuild"
|
||||||
|
}
|
||||||
Symlink
+1
@@ -0,0 +1 @@
|
|||||||
|
../modrinth-enhanced-bin/vblank-shim.c
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
pkgbase = moondeckbuddy-bin
|
||||||
|
pkgdesc = Host companion that lets the MoonDeck Steam Deck plugin control Steam and the PC (upstream AppImage)
|
||||||
|
pkgver = 1.10.0
|
||||||
|
pkgrel = 1
|
||||||
|
url = https://github.com/FrogTheFrog/moondeck-buddy
|
||||||
|
arch = x86_64
|
||||||
|
license = LGPL-3.0-only
|
||||||
|
depends = bash
|
||||||
|
depends = e2fsprogs
|
||||||
|
depends = fontconfig
|
||||||
|
depends = freetype2
|
||||||
|
depends = glibc
|
||||||
|
depends = hicolor-icon-theme
|
||||||
|
depends = libgcc
|
||||||
|
depends = libglvnd
|
||||||
|
depends = libgpg-error
|
||||||
|
depends = libstdc++
|
||||||
|
depends = libx11
|
||||||
|
depends = libxcb
|
||||||
|
depends = zlib
|
||||||
|
provides = moondeckbuddy
|
||||||
|
conflicts = moondeckbuddy
|
||||||
|
conflicts = moondeckbuddy-appimage
|
||||||
|
noextract = moondeckbuddy-bin-1.10.0.AppImage
|
||||||
|
options = !strip
|
||||||
|
options = !debug
|
||||||
|
source = moondeckbuddy-bin-1.10.0.AppImage::https://github.com/FrogTheFrog/moondeck-buddy/releases/download/v1.10.0/MoonDeckBuddy-1.10.0-x86_64.AppImage
|
||||||
|
source = LICENSE-1.10.0::https://raw.githubusercontent.com/FrogTheFrog/moondeck-buddy/v1.10.0/LICENSE
|
||||||
|
sha256sums = 51960ec27f897818e10f6e06a3c8994eebfd05c58c9c51ed89cad5b53caa5a46
|
||||||
|
sha256sums = a5681bf9b05db14d86776930017c647ad9e6e56ff6bbcfdf21e5848288dfaf1b
|
||||||
|
|
||||||
|
pkgname = moondeckbuddy-bin
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
# Maintainer: Felitendo
|
||||||
|
# This PKGBUILD is updated automatically:
|
||||||
|
# https://git.felo.gg/Felitendo/PKGBUILDS
|
||||||
|
|
||||||
|
pkgname=moondeckbuddy-bin
|
||||||
|
pkgver=1.10.0
|
||||||
|
pkgrel=1
|
||||||
|
pkgdesc="Host companion that lets the MoonDeck Steam Deck plugin control Steam and the PC (upstream AppImage)"
|
||||||
|
arch=('x86_64')
|
||||||
|
url="https://github.com/FrogTheFrog/moondeck-buddy"
|
||||||
|
license=('LGPL-3.0-only')
|
||||||
|
# the AppImage bundles Qt6, OpenSSL, glib, libproc2 and the xcb stack; these
|
||||||
|
# are what is left over (bash runs upstream's AppRun)
|
||||||
|
depends=('bash' 'e2fsprogs' 'fontconfig' 'freetype2' 'glibc'
|
||||||
|
'hicolor-icon-theme' 'libgcc' 'libglvnd' 'libgpg-error' 'libstdc++'
|
||||||
|
'libx11' 'libxcb' 'zlib')
|
||||||
|
provides=('moondeckbuddy')
|
||||||
|
conflicts=('moondeckbuddy' 'moondeckbuddy-appimage')
|
||||||
|
options=('!strip' '!debug')
|
||||||
|
source=("${pkgname}-${pkgver}.AppImage::https://github.com/FrogTheFrog/moondeck-buddy/releases/download/v${pkgver}/MoonDeckBuddy-${pkgver}-x86_64.AppImage"
|
||||||
|
"LICENSE-${pkgver}::https://raw.githubusercontent.com/FrogTheFrog/moondeck-buddy/v${pkgver}/LICENSE")
|
||||||
|
noextract=("${pkgname}-${pkgver}.AppImage")
|
||||||
|
sha256sums=('51960ec27f897818e10f6e06a3c8994eebfd05c58c9c51ed89cad5b53caa5a46' 'a5681bf9b05db14d86776930017c647ad9e6e56ff6bbcfdf21e5848288dfaf1b')
|
||||||
|
|
||||||
|
prepare() {
|
||||||
|
chmod +x "$srcdir/${pkgname}-${pkgver}.AppImage"
|
||||||
|
"$srcdir/${pkgname}-${pkgver}.AppImage" --appimage-extract > /dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
package() {
|
||||||
|
local _root="$srcdir/squashfs-root"
|
||||||
|
|
||||||
|
# upstream's AppImage payload, installed unchanged apart from the top-level
|
||||||
|
# icon/desktop symlinks only the AppImage runtime uses
|
||||||
|
install -d "$pkgdir/opt/$pkgname"
|
||||||
|
cp -a "$_root/." "$pkgdir/opt/$pkgname/"
|
||||||
|
rm -f "$pkgdir/opt/$pkgname/"{.DirIcon,MoonDeckBuddy.desktop,moondeckbuddy.png}
|
||||||
|
# the bundled libraries' copyright files are world-writable in the image,
|
||||||
|
# and linuxdeploy leaves a few empty directories behind
|
||||||
|
chmod -R go-w "$pkgdir/opt/$pkgname"
|
||||||
|
find "$pkgdir/opt/$pkgname" -type d -empty -delete
|
||||||
|
|
||||||
|
# The AppRun forces the bundled xcb platform plugin (there is no Wayland one
|
||||||
|
# in the bundle), so the binaries go through it. Buddy writes its own path
|
||||||
|
# into the autostart entry and systemd user service it creates and takes it
|
||||||
|
# from $APPIMAGE when set - pointing that at the wrapper keeps autostart on
|
||||||
|
# the AppRun too, just as the AppRun does with the AppImage's own path.
|
||||||
|
install -d "$pkgdir/usr/bin"
|
||||||
|
local _bin
|
||||||
|
for _bin in MoonDeckBuddy MoonDeckStream; do
|
||||||
|
cat > "$pkgdir/usr/bin/$_bin" << EOF
|
||||||
|
#!/bin/sh
|
||||||
|
APPIMAGE=/usr/bin/$_bin exec /opt/$pkgname/AppRun --exec $_bin "\$@"
|
||||||
|
EOF
|
||||||
|
chmod 755 "$pkgdir/usr/bin/$_bin"
|
||||||
|
done
|
||||||
|
|
||||||
|
install -Dm644 "$_root/usr/share/applications/MoonDeckBuddy.desktop" \
|
||||||
|
"$pkgdir/usr/share/applications/MoonDeckBuddy.desktop"
|
||||||
|
local _size
|
||||||
|
for _size in 16 32 64 128 256; do
|
||||||
|
install -Dm644 "$_root/usr/share/icons/hicolor/${_size}x${_size}/apps/moondeckbuddy.png" \
|
||||||
|
"$pkgdir/usr/share/icons/hicolor/${_size}x${_size}/apps/moondeckbuddy.png"
|
||||||
|
done
|
||||||
|
|
||||||
|
install -Dm644 "$srcdir/LICENSE-${pkgver}" \
|
||||||
|
"$pkgdir/usr/share/licenses/$pkgname/LICENSE"
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
# moondeckbuddy-bin - MoonDeck Buddy (https://github.com/FrogTheFrog/moondeck-buddy),
|
||||||
|
# the host-side companion of the MoonDeck Steam Deck plugin (C++23 + Qt6).
|
||||||
|
#
|
||||||
|
# Upstream publishes a linuxdeploy AppImage per release, which the PKGBUILD
|
||||||
|
# unpacks into /opt - so there is no build step here, only pkgver and the
|
||||||
|
# checksums are refreshed on a new version. The license text is not part of
|
||||||
|
# the AppImage and comes from the matching source tag.
|
||||||
|
#
|
||||||
|
# Releases are created as drafts by upstream's CI and published by hand, so
|
||||||
|
# /releases/latest never points at a release whose assets are still missing.
|
||||||
|
|
||||||
|
UPSTREAM_REPO="FrogTheFrog/moondeck-buddy"
|
||||||
|
|
||||||
|
# The AUR already carries moondeckbuddy-appimage, which ships the same upstream
|
||||||
|
# AppImage, so publishing this as well would be a second copy of one package.
|
||||||
|
# Flip this to true to publish; until then the PKGBUILD is still kept current
|
||||||
|
# and test-built here.
|
||||||
|
AUR_PUBLISH=false
|
||||||
|
|
||||||
|
latest_version() {
|
||||||
|
gh api "repos/$UPSTREAM_REPO/releases/latest" --jq '.tag_name' | sed 's/^v//'
|
||||||
|
}
|
||||||
|
|
||||||
|
# refresh_checksums <version> <pkgbuild-path>
|
||||||
|
refresh_checksums() {
|
||||||
|
local ver="$1" pkgbuild="$2"
|
||||||
|
local sha_img sha_lic
|
||||||
|
|
||||||
|
sha_img="$(curl -sfL "https://github.com/$UPSTREAM_REPO/releases/download/v$ver/MoonDeckBuddy-$ver-x86_64.AppImage" \
|
||||||
|
| sha256sum | cut -d' ' -f1)"
|
||||||
|
sha_lic="$(curl -sfL "https://raw.githubusercontent.com/$UPSTREAM_REPO/v$ver/LICENSE" \
|
||||||
|
| sha256sum | cut -d' ' -f1)"
|
||||||
|
|
||||||
|
sed -i "s|^sha256sums=.*|sha256sums=('$sha_img' '$sha_lic')|" "$pkgbuild"
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
pkgbase = moondeckbuddy
|
||||||
|
pkgdesc = Host companion that lets the MoonDeck Steam Deck plugin control Steam and the PC
|
||||||
|
pkgver = 1.10.0
|
||||||
|
pkgrel = 1
|
||||||
|
url = https://github.com/FrogTheFrog/moondeck-buddy
|
||||||
|
arch = x86_64
|
||||||
|
license = LGPL-3.0-only
|
||||||
|
license = MIT
|
||||||
|
makedepends = cmake
|
||||||
|
makedepends = ninja
|
||||||
|
depends = glibc
|
||||||
|
depends = hicolor-icon-theme
|
||||||
|
depends = libgcc
|
||||||
|
depends = libstdc++
|
||||||
|
depends = procps-ng
|
||||||
|
depends = qt6-base
|
||||||
|
depends = qt6-httpserver
|
||||||
|
depends = qt6-websockets
|
||||||
|
conflicts = moondeckbuddy-appimage
|
||||||
|
source = moondeckbuddy-1.10.0.tar.gz::https://github.com/FrogTheFrog/moondeck-buddy/archive/refs/tags/v1.10.0.tar.gz
|
||||||
|
source = moondeck-keys-9d1cc7356181f6f6c0aa2a5e92ad7174f09fa539.tar.gz::https://github.com/FrogTheFrog/moondeck-keys/archive/9d1cc7356181f6f6c0aa2a5e92ad7174f09fa539.tar.gz
|
||||||
|
source = glaze-7.7.1.tar.gz::https://github.com/stephenberry/glaze/archive/refs/tags/v7.7.1.tar.gz
|
||||||
|
sha256sums = f68aff3e26c51618bd78e7656cfe3481fd0c4d2be377a26fc4e5db54e9541642
|
||||||
|
sha256sums = 80438b7cec54f89e3b03ad4bf1bf46edd36a8438e5ebcdb5333ecacd45aba7cc
|
||||||
|
sha256sums = c51217ca374f2a7d556c501a849d3a43dfffff47ba7711b6f0c22020e71ff63d
|
||||||
|
|
||||||
|
pkgname = moondeckbuddy
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
# Maintainer: Felitendo
|
||||||
|
# This PKGBUILD is updated automatically:
|
||||||
|
# https://git.felo.gg/Felitendo/PKGBUILDS
|
||||||
|
|
||||||
|
pkgname=moondeckbuddy
|
||||||
|
pkgver=1.10.0
|
||||||
|
pkgrel=1
|
||||||
|
pkgdesc="Host companion that lets the MoonDeck Steam Deck plugin control Steam and the PC"
|
||||||
|
arch=('x86_64')
|
||||||
|
url="https://github.com/FrogTheFrog/moondeck-buddy"
|
||||||
|
# MIT: glaze, a header-only JSON library compiled into both binaries
|
||||||
|
license=('LGPL-3.0-only' 'MIT')
|
||||||
|
depends=('glibc' 'hicolor-icon-theme' 'libgcc' 'libstdc++' 'procps-ng'
|
||||||
|
'qt6-base' 'qt6-httpserver' 'qt6-websockets')
|
||||||
|
makedepends=('cmake' 'ninja')
|
||||||
|
conflicts=('moondeckbuddy-appimage')
|
||||||
|
# The tag tarball carries neither the resources/ssl submodule (the self-signed
|
||||||
|
# certificate Buddy and MoonDeck share) nor glaze, which CMake would fetch at
|
||||||
|
# configure time. Both are pinned to what the tag references; see pkg.sh.
|
||||||
|
_keys_commit="9d1cc7356181f6f6c0aa2a5e92ad7174f09fa539"
|
||||||
|
_glaze_ver="7.7.1"
|
||||||
|
source=("${pkgname}-${pkgver}.tar.gz::https://github.com/FrogTheFrog/moondeck-buddy/archive/refs/tags/v${pkgver}.tar.gz"
|
||||||
|
"moondeck-keys-${_keys_commit}.tar.gz::https://github.com/FrogTheFrog/moondeck-keys/archive/${_keys_commit}.tar.gz"
|
||||||
|
"glaze-${_glaze_ver}.tar.gz::https://github.com/stephenberry/glaze/archive/refs/tags/v${_glaze_ver}.tar.gz")
|
||||||
|
sha256sums=('f68aff3e26c51618bd78e7656cfe3481fd0c4d2be377a26fc4e5db54e9541642' '80438b7cec54f89e3b03ad4bf1bf46edd36a8438e5ebcdb5333ecacd45aba7cc' 'c51217ca374f2a7d556c501a849d3a43dfffff47ba7711b6f0c22020e71ff63d')
|
||||||
|
|
||||||
|
prepare() {
|
||||||
|
cd "moondeck-buddy-${pkgver}"
|
||||||
|
|
||||||
|
rm -rf resources/ssl
|
||||||
|
ln -s "$srcdir/moondeck-keys-${_keys_commit}" resources/ssl
|
||||||
|
|
||||||
|
# upstream builds with -Werror against GCC 13 and Qt 6.8; warnings that a
|
||||||
|
# newer toolchain adds must not fail the package build
|
||||||
|
sed -i 's/ -Werror)/)/' CMakeLists.txt
|
||||||
|
}
|
||||||
|
|
||||||
|
build() {
|
||||||
|
cmake -B build -S "moondeck-buddy-${pkgver}" -G Ninja \
|
||||||
|
-DCMAKE_BUILD_TYPE=None \
|
||||||
|
-DCMAKE_INSTALL_PREFIX=/usr \
|
||||||
|
-DFETCHCONTENT_FULLY_DISCONNECTED=ON \
|
||||||
|
-DFETCHCONTENT_SOURCE_DIR_GLAZE="$srcdir/glaze-${_glaze_ver}"
|
||||||
|
cmake --build build
|
||||||
|
}
|
||||||
|
|
||||||
|
package() {
|
||||||
|
# both binaries, the desktop entry and the icons
|
||||||
|
DESTDIR="$pkgdir" cmake --install build
|
||||||
|
|
||||||
|
install -Dm644 "moondeck-buddy-${pkgver}/LICENSE" \
|
||||||
|
"$pkgdir/usr/share/licenses/$pkgname/LICENSE"
|
||||||
|
install -Dm644 "glaze-${_glaze_ver}/LICENSE" \
|
||||||
|
"$pkgdir/usr/share/licenses/$pkgname/LICENSE.glaze"
|
||||||
|
}
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
# moondeckbuddy - MoonDeck Buddy (https://github.com/FrogTheFrog/moondeck-buddy),
|
||||||
|
# the host-side companion of the MoonDeck Steam Deck plugin (C++23 + Qt6).
|
||||||
|
#
|
||||||
|
# Source package: the PKGBUILD builds the release tag against Arch's Qt6 - the
|
||||||
|
# same CMake project upstream hands to linuxdeploy for the AppImage that
|
||||||
|
# moondeckbuddy-bin repackages.
|
||||||
|
#
|
||||||
|
# The tag tarball lacks two inputs of the build, both pinned per release:
|
||||||
|
# - resources/ssl is a git submodule (FrogTheFrog/moondeck-keys) holding the
|
||||||
|
# self-signed certificate compiled into Buddy; its commit is read from the
|
||||||
|
# tag's tree.
|
||||||
|
# - glaze is pulled by src/lib/json/CMakeLists.txt with FetchContent at
|
||||||
|
# configure time; its GIT_TAG is read from that file, and the PKGBUILD points
|
||||||
|
# FETCHCONTENT_SOURCE_DIR_GLAZE at the matching tarball so build() needs no
|
||||||
|
# network.
|
||||||
|
#
|
||||||
|
# Releases are created as drafts by upstream's CI and published by hand, so
|
||||||
|
# /releases/latest never points at a half-finished release.
|
||||||
|
|
||||||
|
UPSTREAM_REPO="FrogTheFrog/moondeck-buddy"
|
||||||
|
|
||||||
|
# Installed in CI (pacman) before the makepkg test build.
|
||||||
|
BUILD_DEPS=(cmake ninja procps-ng qt6-base qt6-httpserver qt6-websockets)
|
||||||
|
|
||||||
|
latest_version() {
|
||||||
|
gh api "repos/$UPSTREAM_REPO/releases/latest" --jq '.tag_name' | sed 's/^v//'
|
||||||
|
}
|
||||||
|
|
||||||
|
# refresh_checksums <version> <pkgbuild-path>
|
||||||
|
refresh_checksums() {
|
||||||
|
local ver="$1" pkgbuild="$2"
|
||||||
|
local keys glaze sha_src sha_keys sha_glaze
|
||||||
|
|
||||||
|
keys="$(gh api "repos/$UPSTREAM_REPO/contents/resources/ssl?ref=v$ver" --jq '.sha')"
|
||||||
|
glaze="$(gh api "repos/$UPSTREAM_REPO/contents/src/lib/json/CMakeLists.txt?ref=v$ver" \
|
||||||
|
-H 'Accept: application/vnd.github.raw' | grep -Po 'GIT_TAG\s+v\K[0-9.]+$')"
|
||||||
|
if [[ ! "$keys" =~ ^[0-9a-f]{40}$ || -z "$glaze" ]]; then
|
||||||
|
echo "could not resolve the moondeck-keys commit ($keys) or glaze version ($glaze) of v$ver" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
sha_src="$(curl -sfL "https://github.com/$UPSTREAM_REPO/archive/refs/tags/v$ver.tar.gz" \
|
||||||
|
| sha256sum | cut -d' ' -f1)"
|
||||||
|
sha_keys="$(curl -sfL "https://github.com/FrogTheFrog/moondeck-keys/archive/$keys.tar.gz" \
|
||||||
|
| sha256sum | cut -d' ' -f1)"
|
||||||
|
sha_glaze="$(curl -sfL "https://github.com/stephenberry/glaze/archive/refs/tags/v$glaze.tar.gz" \
|
||||||
|
| sha256sum | cut -d' ' -f1)"
|
||||||
|
|
||||||
|
sed -i \
|
||||||
|
-e "s|^_keys_commit=.*|_keys_commit=\"$keys\"|" \
|
||||||
|
-e "s|^_glaze_ver=.*|_glaze_ver=\"$glaze\"|" \
|
||||||
|
-e "s|^sha256sums=.*|sha256sums=('$sha_src' '$sha_keys' '$sha_glaze')|" \
|
||||||
|
"$pkgbuild"
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
pkgbase = moonlight-vrr-bin
|
||||||
|
pkgdesc = GameStream client for PCs, fork of moonlight-qt with smooth VRR pacing (upstream AppImage)
|
||||||
|
pkgver = 6.1.0_vrr18
|
||||||
|
pkgrel = 1
|
||||||
|
url = https://github.com/Nonary/moonlight-qt
|
||||||
|
arch = x86_64
|
||||||
|
license = GPL-3.0-or-later
|
||||||
|
depends = e2fsprogs
|
||||||
|
depends = fontconfig
|
||||||
|
depends = freetype2
|
||||||
|
depends = glibc
|
||||||
|
depends = harfbuzz
|
||||||
|
depends = hicolor-icon-theme
|
||||||
|
depends = libdrm
|
||||||
|
depends = libgcc
|
||||||
|
depends = libglvnd
|
||||||
|
depends = libgpg-error
|
||||||
|
depends = libice
|
||||||
|
depends = libsm
|
||||||
|
depends = libstdc++
|
||||||
|
depends = libx11
|
||||||
|
depends = libxcb
|
||||||
|
depends = zlib
|
||||||
|
optdepends = libva-intel-driver: hardware acceleration for Intel GPUs up to Coffee Lake
|
||||||
|
optdepends = intel-media-driver: hardware acceleration for Intel GPUs from Broadwell on
|
||||||
|
provides = moonlight-vrr
|
||||||
|
provides = moonlight-qt
|
||||||
|
conflicts = moonlight-vrr
|
||||||
|
conflicts = moonlight-qt
|
||||||
|
noextract = moonlight-vrr-bin-6.1.0_vrr18.AppImage
|
||||||
|
options = !strip
|
||||||
|
options = !debug
|
||||||
|
source = moonlight-vrr-bin-6.1.0_vrr18.AppImage::https://github.com/Nonary/moonlight-qt/releases/download/v6.1.0-vrr18/Moonlight-6.1.0-vrr18-x86_64.AppImage
|
||||||
|
sha256sums = 5b5992eb0d9d6528ca6db83c33da3bf6cbecea0f5a8f7b9b34dcd5d22d13f40c
|
||||||
|
|
||||||
|
pkgname = moonlight-vrr-bin
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
# Maintainer: Felitendo
|
||||||
|
# This PKGBUILD is updated automatically:
|
||||||
|
# https://git.felo.gg/Felitendo/PKGBUILDS
|
||||||
|
|
||||||
|
pkgname=moonlight-vrr-bin
|
||||||
|
pkgver=6.1.0_vrr18
|
||||||
|
pkgrel=1
|
||||||
|
pkgdesc="GameStream client for PCs, fork of moonlight-qt with smooth VRR pacing (upstream AppImage)"
|
||||||
|
arch=('x86_64')
|
||||||
|
url="https://github.com/Nonary/moonlight-qt"
|
||||||
|
license=('GPL-3.0-or-later')
|
||||||
|
# the AppImage bundles Qt6, FFmpeg, SDL, libplacebo and the rest of the stack;
|
||||||
|
# these are what is left over
|
||||||
|
depends=('e2fsprogs' 'fontconfig' 'freetype2' 'glibc' 'harfbuzz'
|
||||||
|
'hicolor-icon-theme' 'libdrm' 'libgcc' 'libglvnd' 'libgpg-error' 'libice'
|
||||||
|
'libsm' 'libstdc++' 'libx11' 'libxcb' 'zlib')
|
||||||
|
optdepends=('libva-intel-driver: hardware acceleration for Intel GPUs up to Coffee Lake'
|
||||||
|
'intel-media-driver: hardware acceleration for Intel GPUs from Broadwell on')
|
||||||
|
provides=('moonlight-vrr' 'moonlight-qt')
|
||||||
|
conflicts=('moonlight-vrr' 'moonlight-qt')
|
||||||
|
options=('!strip' '!debug')
|
||||||
|
# upstream tags use hyphens (v6.1.0-vrr18), which pkgver must not contain
|
||||||
|
_upver="${pkgver//_/-}"
|
||||||
|
source=("${pkgname}-${pkgver}.AppImage::${url}/releases/download/v${_upver}/Moonlight-${_upver}-x86_64.AppImage")
|
||||||
|
noextract=("${pkgname}-${pkgver}.AppImage")
|
||||||
|
sha256sums=('5b5992eb0d9d6528ca6db83c33da3bf6cbecea0f5a8f7b9b34dcd5d22d13f40c')
|
||||||
|
|
||||||
|
prepare() {
|
||||||
|
chmod +x "$srcdir/${pkgname}-${pkgver}.AppImage"
|
||||||
|
"$srcdir/${pkgname}-${pkgver}.AppImage" --appimage-extract > /dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
package() {
|
||||||
|
local _root="$srcdir/squashfs-root"
|
||||||
|
|
||||||
|
# upstream's AppImage payload, installed unchanged
|
||||||
|
install -d "$pkgdir/opt/$pkgname"
|
||||||
|
cp -a "$_root/usr/." "$pkgdir/opt/$pkgname/"
|
||||||
|
# the squashfs has private directories and world writable files
|
||||||
|
chmod -R u=rwX,go=rX "$pkgdir/opt/$pkgname"
|
||||||
|
|
||||||
|
# the binary has a RUNPATH into the bundle and reads the qt.conf next to it,
|
||||||
|
# so it has to be exec'd where it is
|
||||||
|
install -d "$pkgdir/usr/bin"
|
||||||
|
cat > "$pkgdir/usr/bin/moonlight" << EOF
|
||||||
|
#!/bin/sh
|
||||||
|
exec /opt/$pkgname/bin/moonlight "\$@"
|
||||||
|
EOF
|
||||||
|
chmod 755 "$pkgdir/usr/bin/moonlight"
|
||||||
|
|
||||||
|
install -Dm644 "$_root/com.moonlight_stream.Moonlight.desktop" \
|
||||||
|
"$pkgdir/usr/share/applications/com.moonlight_stream.Moonlight.desktop"
|
||||||
|
sed -i '/^X-AppImage-/d' "$pkgdir/usr/share/applications/com.moonlight_stream.Moonlight.desktop"
|
||||||
|
install -Dm644 "$_root/usr/share/metainfo/com.moonlight_stream.Moonlight.appdata.xml" \
|
||||||
|
"$pkgdir/usr/share/metainfo/com.moonlight_stream.Moonlight.appdata.xml"
|
||||||
|
install -Dm644 "$_root/usr/share/icons/hicolor/scalable/apps/moonlight.svg" \
|
||||||
|
"$pkgdir/usr/share/icons/hicolor/scalable/apps/moonlight.svg"
|
||||||
|
}
|
||||||
Loaded 100 of 161 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user