Merge remote-tracking branch 'upstream/master' into spark/nvidia-dp-detach
This commit is contained in:
commit
e4b00e594c
191 files changed
+20188
-702
No files matched your search
@@ -1,7 +1,11 @@
|
||||
const BUILD = '.github/workflows/build-pr.yml';
|
||||
const TESTS = '.github/workflows/test.yml';
|
||||
|
||||
// pullRequest/action/since default to the pull_request_target event. The
|
||||
// sync workflows pass them explicitly: GitHub creates no pull_request_target
|
||||
// run for a GITHUB_TOKEN push, so they release their own pushes' held runs.
|
||||
module.exports = async function approve({ github, context, core, vouchStatus,
|
||||
pullRequest = context.payload.pull_request, action = context.payload.action, since,
|
||||
sleep = ms => new Promise(resolve => setTimeout(resolve, ms)), attempts = 36 }) {
|
||||
// Missing/failed vouch lookups must not become approval. Denouncements
|
||||
// remain absolute, just as they are in the package build gate.
|
||||
@@ -9,8 +13,8 @@ module.exports = async function approve({ github, context, core, vouchStatus,
|
||||
throw new Error(`Cannot approve workflows: vouch status is ${vouchStatus || 'missing'}.`);
|
||||
}
|
||||
|
||||
const expected = context.payload.pull_request;
|
||||
const eventTime = Date.parse(expected.updated_at);
|
||||
const expected = pullRequest;
|
||||
const eventTime = Date.parse(since ?? expected.updated_at);
|
||||
if (!Number.isFinite(eventTime)) throw new Error('Missing PR event timestamp.');
|
||||
const approved = new Set();
|
||||
let precedingBuild;
|
||||
@@ -47,7 +51,7 @@ module.exports = async function approve({ github, context, core, vouchStatus,
|
||||
const newestBuild = runs.findLast(run => run.path === BUILD);
|
||||
if (!newestBuild || !(Date.parse(newestBuild.created_at) >= eventTime) ||
|
||||
!runs.some(run => run.path === TESTS &&
|
||||
(context.payload.action === 'labeled' || Date.parse(run.created_at) >= eventTime))) continue;
|
||||
(action === 'labeled' || Date.parse(run.created_at) >= eventTime))) continue;
|
||||
|
||||
if (precedingBuild) {
|
||||
const { data: run } = await github.rest.actions.getWorkflowRun({
|
||||
@@ -71,7 +75,13 @@ module.exports = async function approve({ github, context, core, vouchStatus,
|
||||
await github.rest.actions.approveWorkflowRun({ ...context.repo, run_id: run.id });
|
||||
approved.add(run.id);
|
||||
core.info(`Approved ${run.path} run ${run.id} for PR #${expected.number}.`);
|
||||
if (run.path === BUILD) precedingBuild = run.id;
|
||||
// Only a newer held build needs this one to take the concurrency slot
|
||||
// first. A lone build may sit pending behind an in-flight build of an
|
||||
// older commit (sync branches queue rather than cancel); waiting for it
|
||||
// to start would time out before the tests run was released.
|
||||
if (run.path === BUILD && pending.some(other => other.path === BUILD && other.id > run.id)) {
|
||||
precedingBuild = run.id;
|
||||
}
|
||||
if (pending.length === 1) return;
|
||||
}
|
||||
throw new Error('Timed out waiting for PR workflows. Remove and reapply build-approved to retry.');
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
const approvePrWorkflows = require('./approve-pr-workflows.cjs');
|
||||
|
||||
const BOT = 'github-actions[bot]';
|
||||
|
||||
// A sync workflow pushes its branch with GITHUB_TOKEN. GitHub holds the
|
||||
// resulting pull_request runs for approval and, unlike a person's push,
|
||||
// creates no pull_request_target run, so approve-pr.yml never sees it. The
|
||||
// sync workflow therefore releases the runs for the commit it just pushed,
|
||||
// under the same rule approve-pr.yml applies: only while a maintainer's
|
||||
// build-approved label is on the PR. It acts only on its own bot-authored,
|
||||
// same-repository PR for the branch and commit it pushed.
|
||||
module.exports = async function approveSyncPush({ github, context, core,
|
||||
number, branch, headSha, since, approve = approvePrWorkflows, ...options }) {
|
||||
if (!Number.isInteger(number) || !branch || !headSha || !since) {
|
||||
throw new Error('Missing sync PR number, branch, head SHA or push time.');
|
||||
}
|
||||
const { data: pr } = await github.rest.pulls.get({ ...context.repo, pull_number: number });
|
||||
const repository = `${context.repo.owner}/${context.repo.repo}`;
|
||||
if (pr.user?.login !== BOT || pr.head.repo?.full_name !== repository ||
|
||||
pr.base.repo?.full_name !== repository || pr.head.ref !== branch) {
|
||||
throw new Error(`PR #${number} is not ${BOT}'s ${branch} PR in ${repository}; refusing to approve.`);
|
||||
}
|
||||
if (pr.state !== 'open' || pr.head.sha !== headSha) {
|
||||
core.info(`PR #${number} is closed or has moved past ${headSha}; nothing to approve.`);
|
||||
return;
|
||||
}
|
||||
if (!pr.labels.some(label => label.name === 'build-approved')) {
|
||||
core.info(`PR #${number} has no build-approved label; its runs wait for a maintainer.`);
|
||||
return;
|
||||
}
|
||||
await approve({ github, context, core, vouchStatus: 'bot', pullRequest: pr,
|
||||
action: 'synchronize', since, ...options });
|
||||
};
|
||||
Executable
+40
@@ -0,0 +1,40 @@
|
||||
#!/bin/bash
|
||||
# Usage: sync-pr-branch.sh BASE_BRANCH [PACKAGE...]
|
||||
#
|
||||
# Prints the branch a sync workflow run pushes to, as branch=/scope= lines for
|
||||
# $GITHUB_OUTPUT. An unscoped (scheduled) run owns BASE_BRANCH and regenerates
|
||||
# it from master every time. A run scoped to named packages regenerates only
|
||||
# those, so it gets its own branch and PR: pushing it to BASE_BRANCH would
|
||||
# replace every other pending update there with just the named packages.
|
||||
set -euo pipefail
|
||||
|
||||
base=${1:?base branch required}
|
||||
shift
|
||||
if (( $# == 0 )); then
|
||||
printf 'branch=%s\nscope=\n' "$base"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
names=()
|
||||
for name in "$@"; do
|
||||
# Package directory names, as pacman allows them. Anything else is a typo
|
||||
# or an attempt to smuggle something into a ref name or PR title.
|
||||
if [[ ! $name =~ ^[a-z0-9@_+][a-z0-9@._+-]*$ ]]; then
|
||||
echo "invalid package name: $name" >&2
|
||||
exit 1
|
||||
fi
|
||||
names+=("$name")
|
||||
done
|
||||
mapfile -t names < <(printf '%s\n' "${names[@]}" | sort -u)
|
||||
|
||||
scope="${names[*]}"
|
||||
slug=$(printf '%s\n' "${names[@]}" | sed 's/[^a-z0-9]\{1,\}/-/g; s/^-//; s/-$//' | paste -sd- -)
|
||||
# Keep long package lists to a readable ref; the hash keeps distinct lists apart.
|
||||
hash=$(printf '%s' "$scope" | sha256sum | cut -c1-10)
|
||||
if [[ -z $slug ]]; then
|
||||
slug=$hash
|
||||
elif (( ${#slug} > 60 )); then
|
||||
slug="${slug:0:48}"
|
||||
slug="${slug%-}-$hash"
|
||||
fi
|
||||
printf 'branch=%s-%s\nscope=%s\n' "$base" "$slug" "$scope"
|
||||
@@ -1,8 +1,9 @@
|
||||
name: Build changed packages
|
||||
|
||||
# Build every package directory a PR touches, one job per package per arch, on
|
||||
# the self-hosted droplet pool. Artifacts are unsigned; publish.yml signs and
|
||||
# publishes them on merge.
|
||||
# Build every package directory a PR touches, one job per package per arch:
|
||||
# x86_64 on the self-hosted droplet pool, aarch64 natively on GitHub's arm64
|
||||
# runners. Artifacts are unsigned; publish.yml signs and publishes them on
|
||||
# merge.
|
||||
#
|
||||
# Tooling runs from the base branch; a PR supplies only pkgbuilds/. The
|
||||
# vouch gate limits who may spend compute; this limits what their PR can run.
|
||||
@@ -19,9 +20,16 @@ on:
|
||||
description: "Space-separated package directories to build"
|
||||
required: true
|
||||
|
||||
# A new push normally cancels the PR's in-flight build. The sync bots'
|
||||
# branches (auto/sync-*) are the exception: they are force-pushed with fresh
|
||||
# upstream releases several times a day, which kept cancelling multi-hour
|
||||
# aarch64 builds before they could finish. There the newest run waits
|
||||
# instead (GitHub keeps at most one pending run per group, replacing older
|
||||
# pending ones), and when it starts it reuses every artifact the finished
|
||||
# build uploaded, so only packages whose tree changed are built again.
|
||||
concurrency:
|
||||
group: build-${{ github.event.pull_request.number || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
cancel-in-progress: ${{ !(github.event.pull_request.head.repo.full_name == github.repository && startsWith(github.head_ref, 'auto/sync-')) }}
|
||||
|
||||
jobs:
|
||||
# Builds cost real machines, so they run only for trusted authors:
|
||||
@@ -87,8 +95,12 @@ jobs:
|
||||
if [[ -n "${{ github.event.inputs.packages }}" ]]; then
|
||||
names="${{ github.event.inputs.packages }}"
|
||||
else
|
||||
# A package the PR deletes has nothing to build.
|
||||
names=$(git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" -- pkgbuilds \
|
||||
| awk -F/ '$1=="pkgbuilds" && NF>2 {print $2}' | sort -u)
|
||||
| awk -F/ '$1=="pkgbuilds" && NF>2 {print $2}' | sort -u \
|
||||
| while read -r name; do
|
||||
if git cat-file -e "${{ github.event.pull_request.head.sha }}:pkgbuilds/$name" 2>/dev/null; then echo "$name"; fi
|
||||
done)
|
||||
fi
|
||||
matrix=$(printf '%s\n' $names | bin/build-matrix)
|
||||
# A package directory whose exact tree already has a build artifact
|
||||
@@ -159,13 +171,17 @@ jobs:
|
||||
build:
|
||||
needs: changes
|
||||
if: needs.changes.outputs.count != '0'
|
||||
runs-on: [self-hosted, omarchy-builder]
|
||||
# The droplets are x86, so aarch64 there runs under QEMU: omarchy-mac-boot
|
||||
# took 2h47m of the 180 minutes, most of it in check().
|
||||
# GitHub's arm64 runners (4 vCPU, 16 GB; ~100 GB disk free in our pilots)
|
||||
# build it natively in 11 minutes, and linux-aurora in 30 (72 under QEMU).
|
||||
runs-on: ${{ matrix.arch == 'aarch64' && 'ubuntu-24.04-arm' || fromJSON('["self-hosted","omarchy-builder"]') }}
|
||||
timeout-minutes: 180
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix: ${{ fromJson(needs.changes.outputs.matrix) }}
|
||||
steps:
|
||||
# Tooling from base: everything that executes on this droplet's host
|
||||
# Tooling from base: everything that executes on this runner's host
|
||||
# (bin/, helpers/, build/) comes from the base branch. Only the PR's
|
||||
# package directories are overlaid. A PR can therefore change what
|
||||
# gets built, never how the runner builds it. A PR that changes both
|
||||
@@ -192,6 +208,19 @@ jobs:
|
||||
env:
|
||||
CONTAINER_ENGINE: docker
|
||||
run: bin/build --mirror edge --arch ${{ matrix.arch }} --package ${{ matrix.package }}
|
||||
# makepkg's check() leaves meson's per-test output in the build tree,
|
||||
# never on stdout, so a failing test shows only a summary line in this
|
||||
# job log. bin/build bind-mounts $SRC_DIR at /src, so those logs outlive
|
||||
# the container. Without this upload an arch-specific test failure
|
||||
# cannot be diagnosed from CI at all (seen on owe 0.2.7, aarch64).
|
||||
- name: Upload test logs
|
||||
if: always() && steps.build.outcome == 'failure'
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: test-logs-${{ matrix.package }}-${{ matrix.arch }}
|
||||
path: src/**/meson-logs/
|
||||
if-no-files-found: ignore
|
||||
retention-days: 14
|
||||
# The artifact label carries the package directory's git tree hash so
|
||||
# the publish step can find the build for exactly the tree that merged.
|
||||
# The package file inside keeps makepkg's standard name untouched.
|
||||
|
||||
@@ -36,13 +36,18 @@ jobs:
|
||||
outputs:
|
||||
matrix: ${{ steps.list.outputs.matrix }}
|
||||
count: ${{ steps.list.outputs.count }}
|
||||
rebuild: ${{ steps.list.outputs.rebuild }}
|
||||
rebuild_count: ${{ steps.list.outputs.rebuild_count }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
persist-credentials: false
|
||||
- id: list
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
if [[ -n "${{ github.event.inputs.packages }}" ]]; then
|
||||
names="${{ github.event.inputs.packages }}"
|
||||
else
|
||||
@@ -53,17 +58,102 @@ jobs:
|
||||
echo "matrix=$matrix" >> "$GITHUB_OUTPUT"
|
||||
echo "count=$(jq '.include | length' <<<"$matrix")" >> "$GITHUB_OUTPUT"
|
||||
jq -r '.include[] | "\(.package) \(.arch) -> \(.channels)"' <<<"$matrix"
|
||||
# Reuse or rebuild, decided per entry and said out loud. An aarch64
|
||||
# tree with no build artifact (PR artifacts last 7 days; a dispatch
|
||||
# may name any package) goes to the rebuild job, which builds it
|
||||
# natively on GitHub's arm64 runner. x86_64 builds inside the
|
||||
# publish job on the droplet, as before.
|
||||
rebuild=()
|
||||
echo "| package | arch | tree | decision |" >> "$GITHUB_STEP_SUMMARY"
|
||||
echo "| --- | --- | --- | --- |" >> "$GITHUB_STEP_SUMMARY"
|
||||
while read -r entry; do
|
||||
package=$(jq -r .package <<<"$entry"); arch=$(jq -r .arch <<<"$entry")
|
||||
hash=$(git rev-parse "HEAD:pkgbuilds/$package")
|
||||
label="$package-$arch-$hash"
|
||||
found=$(curl -fsS -H "Authorization: Bearer $GH_TOKEN" -H "Accept: application/vnd.github+json" \
|
||||
"https://api.github.com/repos/${{ github.repository }}/actions/artifacts?name=$label&per_page=5" \
|
||||
| jq -r '[.artifacts[] | select(.expired|not)] | sort_by(.created_at) | last | select(. != null) | "run \(.workflow_run.id), expires \(.expires_at)"')
|
||||
if [[ -n "$found" ]]; then
|
||||
decision="reuse the build artifact ($found)"
|
||||
elif [[ $arch == aarch64 ]]; then
|
||||
decision="no build artifact: rebuild natively on ubuntu-24.04-arm"
|
||||
rebuild+=("$entry")
|
||||
else
|
||||
decision="no build artifact: build in the publish job on the self-hosted builder"
|
||||
fi
|
||||
echo "==> $label: $decision"
|
||||
echo "| $package | $arch | ${hash:0:12} | $decision |" >> "$GITHUB_STEP_SUMMARY"
|
||||
done < <(jq -c '.include[]' <<<"$matrix")
|
||||
echo "rebuild=$(printf '%s\n' "${rebuild[@]}" | jq -sc '{include: .}')" >> "$GITHUB_OUTPUT"
|
||||
echo "rebuild_count=${#rebuild[@]}" >> "$GITHUB_OUTPUT"
|
||||
|
||||
# The aarch64 half of "build it now when there is none". It builds exactly
|
||||
# as build-pr.yml's aarch64 path does (same runner, same builder image,
|
||||
# same bin/build call) and uploads under the same label, so the publish
|
||||
# job collects this run's artifact the way it collects a PR's. No secret
|
||||
# reaches this runner; signing and upload stay on the self-hosted builder.
|
||||
rebuild:
|
||||
needs: changes
|
||||
if: needs.changes.outputs.rebuild_count != '0'
|
||||
runs-on: ubuntu-24.04-arm
|
||||
timeout-minutes: 180
|
||||
permissions:
|
||||
contents: read
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix: ${{ fromJson(needs.changes.outputs.rebuild) }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
# The same check the publish job makes before building: a re-run for a
|
||||
# package the channel already holds at master's version builds
|
||||
# nothing, and uploads nothing that could shadow the published file.
|
||||
- name: Build ${{ matrix.package }} (${{ matrix.arch }}, native)
|
||||
id: build
|
||||
env:
|
||||
CONTAINER_ENGINE: docker
|
||||
run: |
|
||||
set -euo pipefail
|
||||
plan=$(bin/build --dry-run --mirror edge --arch "${{ matrix.arch }}" --package "${{ matrix.package }}" 2>&1 | grep -E '^==> Plan complete' || true)
|
||||
if [[ -n "$plan" && -z "$(sed -E 's/.*would build: *//' <<<"$plan" | tr -d '[:space:]')" ]]; then
|
||||
echo "==> ${{ matrix.package }} (${{ matrix.arch }}): already published at master's version, nothing to build"
|
||||
echo "built=false" >> "$GITHUB_OUTPUT"
|
||||
exit 0
|
||||
fi
|
||||
bin/build --mirror edge --arch "${{ matrix.arch }}" --package "${{ matrix.package }}"
|
||||
echo "built=true" >> "$GITHUB_OUTPUT"
|
||||
- name: Pack artifact
|
||||
if: steps.build.outputs.built == 'true'
|
||||
id: pack
|
||||
run: |
|
||||
source helpers/artifact-helpers.sh
|
||||
pack_packages build-output/edge/${{ matrix.arch }} packages.tar
|
||||
tar -tvf packages.tar
|
||||
echo "label=${{ matrix.package }}-${{ matrix.arch }}-$(git rev-parse "HEAD:pkgbuilds/${{ matrix.package }}")" >> "$GITHUB_OUTPUT"
|
||||
- name: Upload artifact
|
||||
if: steps.build.outputs.built == 'true'
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{ steps.pack.outputs.label }}
|
||||
path: packages.tar
|
||||
if-no-files-found: error
|
||||
retention-days: 7
|
||||
|
||||
# One job for the whole merge. It collects every PR artifact for the
|
||||
# merged tree (building only what has none), then walks each channel and
|
||||
# merged tree (building only what has none; aarch64 comes from the
|
||||
# rebuild job above), then walks each channel and
|
||||
# architecture slot exactly once: pull that database, add every package
|
||||
# that belongs in it, upload. Six slots, six round trips, however many
|
||||
# packages the merge carried. One process is the only writer, so there
|
||||
# is no race between packages; the run-level concurrency group above
|
||||
# keeps one merge from overlapping the next.
|
||||
# It waits for the rebuild job and runs whatever that job's result: a
|
||||
# failed rebuild leaves its package without an artifact, and the collect
|
||||
# step below records that and stops before any publish.
|
||||
publish:
|
||||
needs: changes
|
||||
if: needs.changes.outputs.count != '0'
|
||||
needs: [changes, rebuild]
|
||||
if: ${{ !cancelled() && needs.changes.result == 'success' && needs.changes.outputs.count != '0' }}
|
||||
runs-on: [self-hosted, omarchy-builder]
|
||||
environment: publish
|
||||
timeout-minutes: 240
|
||||
@@ -104,15 +194,22 @@ jobs:
|
||||
label="$package-$arch-$hash"
|
||||
found=$(curl -fsS -H "Authorization: Bearer $GH_TOKEN" -H "Accept: application/vnd.github+json" \
|
||||
"https://api.github.com/repos/${{ github.repository }}/actions/artifacts?name=$label&per_page=5" \
|
||||
| jq -r '[.artifacts[] | select(.expired|not)] | sort_by(.created_at) | last | .archive_download_url // empty')
|
||||
| jq -r '[.artifacts[] | select(.expired|not)] | sort_by(.created_at) | last | select(. != null) | "\(.archive_download_url) \(.workflow_run.id)"')
|
||||
read -r found from_run <<<"$found" || true
|
||||
mkdir -p "build-output/edge/$arch"
|
||||
if [[ -n "$found" ]]; then
|
||||
echo "==> $label: PR artifact"
|
||||
if [[ $from_run == "${{ github.run_id }}" ]]; then
|
||||
kind=native-rebuild
|
||||
echo "==> $label: artifact from this run's native $arch rebuild"
|
||||
else
|
||||
kind=pr-artifact
|
||||
echo "==> $label: reusing the build artifact from run $from_run"
|
||||
fi
|
||||
rm -rf /tmp/artifact; mkdir -p /tmp/artifact
|
||||
if curl -fsSL -H "Authorization: Bearer $GH_TOKEN" -o /tmp/artifact.zip "$found" \
|
||||
&& unzip -oq /tmp/artifact.zip -d /tmp/artifact \
|
||||
&& unpack_packages /tmp/artifact "build-output/edge/$arch"; then
|
||||
jq -nc --arg p "$package" --arg a "$arch" '{package:$p, arch:$a, source:"pr-artifact"}' >> sources.jsonl
|
||||
jq -nc --arg p "$package" --arg a "$arch" --arg s "$kind" '{package:$p, arch:$a, source:$s}' >> sources.jsonl
|
||||
else
|
||||
jq -nc --arg p "$package" --arg a "$arch" '{package:$p, arch:$a, source:"artifact-download-failed"}' >> sources.jsonl; failed=1; break
|
||||
fi
|
||||
@@ -128,6 +225,14 @@ jobs:
|
||||
jq -nc --arg p "$package" --arg a "$arch" '{package:$p, arch:$a, source:"already-published"}' >> sources.jsonl
|
||||
continue
|
||||
fi
|
||||
# aarch64 never builds here: this droplet is x86 and would
|
||||
# emulate it. No artifact means the native rebuild failed (see
|
||||
# the rebuild job), or an artifact expired between planning
|
||||
# and now (re-run all jobs).
|
||||
if [[ $arch == aarch64 ]]; then
|
||||
echo "::error::$label: no artifact from the native rebuild; not building aarch64 under emulation"
|
||||
jq -nc --arg p "$package" --arg a "$arch" '{package:$p, arch:$a, source:"native-build-failed"}' >> sources.jsonl; failed=1; break
|
||||
fi
|
||||
echo "==> $label: no artifact for this tree, building"
|
||||
if OMARCHY_KEEP_BUILD_WORKSPACE=1 bin/build --mirror edge --arch "$arch" --package "$package"; then
|
||||
jq -nc --arg p "$package" --arg a "$arch" '{package:$p, arch:$a, source:"built"}' >> sources.jsonl
|
||||
@@ -269,7 +374,7 @@ jobs:
|
||||
run: |
|
||||
jq -r --arg outcome "${{ needs.publish.result }}" '
|
||||
def pkgs: [.packages[] | select(test("-debug-")|not)] | join(", ");
|
||||
def src: if .source=="pr-artifact" then "PR artifact" elif .source=="built" then "built here" elif .source=="already-published" then "already published, skipped" else "**" + .source + "**" end;
|
||||
def src: if .source=="pr-artifact" then "PR artifact" elif .source=="native-rebuild" then "rebuilt natively on arm64" elif .source=="built" then "built here" elif .source=="already-published" then "already published, skipped" else "**" + .source + "**" end;
|
||||
"### Publish " + (if $outcome=="success" then "succeeded" else "FAILED" end) +
|
||||
" → **" + .target + "**" + (if .target!="live" then " (proof prefix, not live)" else "" end),
|
||||
"",
|
||||
@@ -322,5 +427,6 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: |
|
||||
echo "publish result: ${{ needs.publish.result }}"
|
||||
echo "changes result: ${{ needs.changes.result }}, publish result: ${{ needs.publish.result }}"
|
||||
[[ "${{ needs.changes.result }}" == "success" ]]
|
||||
[[ "${{ needs.publish.result }}" == "success" || "${{ needs.publish.result }}" == "skipped" ]]
|
||||
@@ -17,6 +17,12 @@ jobs:
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
outputs:
|
||||
branch: ${{ steps.branch.outputs.branch }}
|
||||
pushed_at: ${{ steps.pushed.outputs.at }}
|
||||
number: ${{ steps.cpr.outputs.pull-request-number }}
|
||||
operation: ${{ steps.cpr.outputs.pull-request-operation }}
|
||||
head_sha: ${{ steps.cpr.outputs.pull-request-head-sha }}
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
@@ -24,6 +30,17 @@ jobs:
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
# A scoped dispatch regenerates only the named packages. Pushed to the
|
||||
# shared branch, that would replace every other pending update in its
|
||||
# PR, so it gets a branch and PR of its own.
|
||||
- name: Choose the PR branch
|
||||
id: branch
|
||||
env:
|
||||
PACKAGES: ${{ github.event.inputs.packages }}
|
||||
run: |
|
||||
read -r -a package_args <<< "${PACKAGES:-}"
|
||||
.github/scripts/sync-pr-branch.sh auto/sync-rebuilds "${package_args[@]}" | tee -a "$GITHUB_OUTPUT"
|
||||
|
||||
# Runs in an Arch container against the mirror the x86_64 builder itself
|
||||
# uses, because the question being asked is what that builder will link
|
||||
# against and a different mirror can be hours ahead of it. Recording a
|
||||
@@ -68,13 +85,21 @@ jobs:
|
||||
echo "has_changes=true" >> "$GITHUB_OUTPUT"
|
||||
fi
|
||||
|
||||
# Runs created by this push are newer than this; the approve job
|
||||
# waits for them. A minute's slack absorbs runner clock skew.
|
||||
- name: Record push time
|
||||
if: steps.changes.outputs.has_changes == 'true'
|
||||
id: pushed
|
||||
run: echo "at=$(date -u -d '-1 minute' +%Y-%m-%dT%H:%M:%SZ)" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Create Pull Request
|
||||
if: steps.changes.outputs.has_changes == 'true'
|
||||
id: cpr
|
||||
uses: peter-evans/create-pull-request@v7
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
commit-message: 'chore: rebuild against updated dependencies'
|
||||
title: 'chore: rebuild against updated dependencies'
|
||||
title: "chore: rebuild against updated dependencies${{ steps.branch.outputs.scope && format(' ({0})', steps.branch.outputs.scope) || '' }}"
|
||||
body: |
|
||||
Automated pkgrel bump for packages that link against a dependency
|
||||
which has moved in the official repositories.
|
||||
@@ -84,7 +109,7 @@ jobs:
|
||||
bump is what makes the rebuilt package an upgrade pacman will offer;
|
||||
without it the build produces the version already published and no
|
||||
one receives it.
|
||||
branch: auto/sync-rebuilds
|
||||
branch: ${{ steps.branch.outputs.branch }}
|
||||
delete-branch: true
|
||||
labels: automated
|
||||
reviewers: ryanrhughes
|
||||
@@ -100,3 +125,35 @@ jobs:
|
||||
"🔴 <strong>Rebuild trigger sync failed</strong><br><a href=\"${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}\">View run</a>" \
|
||||
'{content: $content}')" \
|
||||
"$BASECAMP_CHATBOT_URL"
|
||||
|
||||
# GitHub holds pull_request runs from a GITHUB_TOKEN push for approval and
|
||||
# creates no pull_request_target run for it, so approve-pr.yml never sees
|
||||
# the sync's own pushes. Once a maintainer has labelled the PR
|
||||
# build-approved, release the held runs for the commit just pushed. A
|
||||
# separate job, so the sync container's token never holds actions: write.
|
||||
approve:
|
||||
needs: sync
|
||||
if: ${{ !cancelled() && needs.sync.outputs.operation == 'updated' }}
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 5
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: read
|
||||
actions: write
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Release held build and test runs if build-approved
|
||||
uses: actions/github-script@v7
|
||||
env:
|
||||
NUMBER: ${{ needs.sync.outputs.number }}
|
||||
BRANCH: ${{ needs.sync.outputs.branch }}
|
||||
HEAD_SHA: ${{ needs.sync.outputs.head_sha }}
|
||||
SINCE: ${{ needs.sync.outputs.pushed_at }}
|
||||
with:
|
||||
script: |
|
||||
const approve = require('./.github/scripts/approve-sync-push.cjs');
|
||||
const { NUMBER, BRANCH, HEAD_SHA, SINCE } = process.env;
|
||||
await approve({ github, context, core, number: Number(NUMBER),
|
||||
branch: BRANCH, headSha: HEAD_SHA, since: SINCE });
|
||||
@@ -17,6 +17,12 @@ jobs:
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
outputs:
|
||||
branch: ${{ steps.branch.outputs.branch }}
|
||||
pushed_at: ${{ steps.pushed.outputs.at }}
|
||||
number: ${{ steps.cpr.outputs.pull-request-number }}
|
||||
operation: ${{ steps.cpr.outputs.pull-request-operation }}
|
||||
head_sha: ${{ steps.cpr.outputs.pull-request-head-sha }}
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
@@ -24,6 +30,17 @@ jobs:
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
# A scoped dispatch regenerates only the named packages. Pushed to the
|
||||
# shared branch, that would replace every other pending update in its
|
||||
# PR, so it gets a branch and PR of its own.
|
||||
- name: Choose the PR branch
|
||||
id: branch
|
||||
env:
|
||||
PACKAGES: ${{ github.event.inputs.packages }}
|
||||
run: |
|
||||
read -r -a package_args <<< "${PACKAGES:-}"
|
||||
.github/scripts/sync-pr-branch.sh auto/sync-upstream "${package_args[@]}" | tee -a "$GITHUB_OUTPUT"
|
||||
|
||||
# Runs in an Arch container for vercmp: whether a release is an upgrade has
|
||||
# to be decided by the same comparator pacman will use on users' machines.
|
||||
- name: Update packages from upstream release feeds
|
||||
@@ -47,11 +64,13 @@ jobs:
|
||||
useradd -m -u "$HOST_UID" -g "$HOST_GID" runner
|
||||
chown -R runner:runner /workspace/pkgbuilds
|
||||
|
||||
# The reviewed lane only: packages marked auto_merge ride
|
||||
# track-branches.yml, which merges without a human.
|
||||
if [[ -n "${PACKAGES:-}" ]]; then
|
||||
read -r -a package_args <<< "$PACKAGES"
|
||||
runuser -u runner -- ./bin/sync-upstream "${package_args[@]}"
|
||||
runuser -u runner -- ./bin/sync-upstream --lane reviewed "${package_args[@]}"
|
||||
else
|
||||
runuser -u runner -- ./bin/sync-upstream
|
||||
runuser -u runner -- ./bin/sync-upstream --lane reviewed
|
||||
fi
|
||||
'
|
||||
env:
|
||||
@@ -70,13 +89,21 @@ jobs:
|
||||
echo "has_changes=true" >> "$GITHUB_OUTPUT"
|
||||
fi
|
||||
|
||||
# Runs created by this push are newer than this; the approve job
|
||||
# waits for them. A minute's slack absorbs runner clock skew.
|
||||
- name: Record push time
|
||||
if: ${{ !cancelled() && steps.changes.outputs.has_changes == 'true' }}
|
||||
id: pushed
|
||||
run: echo "at=$(date -u -d '-1 minute' +%Y-%m-%dT%H:%M:%SZ)" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Create Pull Request
|
||||
if: ${{ !cancelled() && steps.changes.outputs.has_changes == 'true' }}
|
||||
id: cpr
|
||||
uses: peter-evans/create-pull-request@v7
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
commit-message: 'chore: sync upstream releases'
|
||||
title: 'chore: sync upstream releases'
|
||||
title: "chore: sync upstream releases${{ steps.branch.outputs.scope && format(' ({0})', steps.branch.outputs.scope) || '' }}"
|
||||
body: |
|
||||
Automated update of packages that track an upstream vendor release
|
||||
feed rather than the AUR.
|
||||
@@ -84,7 +111,7 @@ jobs:
|
||||
Release watches and providers are declared in `.omarchy/package.json`;
|
||||
exceptional feeds use `.omarchy/upstream.sh`. Failed package updates
|
||||
are left untouched; check the workflow result for outstanding failures.
|
||||
branch: auto/sync-upstream
|
||||
branch: ${{ steps.branch.outputs.branch }}
|
||||
delete-branch: true
|
||||
labels: automated
|
||||
reviewers: ryanrhughes
|
||||
@@ -100,3 +127,35 @@ jobs:
|
||||
"🔴 <strong>Upstream sync failed</strong><br><a href=\"${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}\">View run</a>" \
|
||||
'{content: $content}')" \
|
||||
"$BASECAMP_CHATBOT_URL"
|
||||
|
||||
# GitHub holds pull_request runs from a GITHUB_TOKEN push for approval and
|
||||
# creates no pull_request_target run for it, so approve-pr.yml never sees
|
||||
# the sync's own pushes. Once a maintainer has labelled the PR
|
||||
# build-approved, release the held runs for the commit just pushed. A
|
||||
# separate job, so the sync container's token never holds actions: write.
|
||||
approve:
|
||||
needs: sync
|
||||
if: ${{ !cancelled() && needs.sync.outputs.operation == 'updated' }}
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 5
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: read
|
||||
actions: write
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Release held build and test runs if build-approved
|
||||
uses: actions/github-script@v7
|
||||
env:
|
||||
NUMBER: ${{ needs.sync.outputs.number }}
|
||||
BRANCH: ${{ needs.sync.outputs.branch }}
|
||||
HEAD_SHA: ${{ needs.sync.outputs.head_sha }}
|
||||
SINCE: ${{ needs.sync.outputs.pushed_at }}
|
||||
with:
|
||||
script: |
|
||||
const approve = require('./.github/scripts/approve-sync-push.cjs');
|
||||
const { NUMBER, BRANCH, HEAD_SHA, SINCE } = process.env;
|
||||
await approve({ github, context, core, number: Number(NUMBER),
|
||||
branch: BRANCH, headSha: HEAD_SHA, since: SINCE });
|
||||
@@ -47,17 +47,21 @@ jobs:
|
||||
-w /workspace \
|
||||
archlinux:base-devel bash -lc '
|
||||
set -euo pipefail
|
||||
pacman -Syu --noconfirm git jq python libarchive
|
||||
pacman -Syu --noconfirm git jq python libarchive neovim tmux
|
||||
python tests/oma-service-removal.py
|
||||
python tests/upstream-watch.py
|
||||
./bin/sync-upstream self-test
|
||||
./bin/sync-rebuilds --self-test
|
||||
./bin/omarchy-pkgs self-test
|
||||
./bin/omarchy-release self-test
|
||||
./tests/neovim-remote-clipboard.sh
|
||||
python tests/neovim-clipboard-tmux.py
|
||||
./tests/partial-release.sh
|
||||
./tests/published-build-plan.sh
|
||||
./tests/pinned-sources.sh
|
||||
./tests/controller.sh
|
||||
./tests/artifact-helpers.sh
|
||||
./tests/limine-mkinitcpio-hook.sh
|
||||
pacman -S --noconfirm --quiet rclone >/dev/null
|
||||
./tests/publish-artifact.sh
|
||||
'
|
||||
@@ -0,0 +1,161 @@
|
||||
name: Track upstream branches
|
||||
|
||||
# The unattended lane. Packages marked "auto_merge": true follow a moving
|
||||
# upstream branch (omarchy-dev and omarchy-settings-dev on quattro, omasnap-git
|
||||
# on main) rather than tagged releases, so nothing in this repository changes
|
||||
# when their source does. This workflow makes each new branch tip a commit pin
|
||||
# in the recipe, which publish.yml then treats like any other version bump:
|
||||
# the PR builds on the droplets, auto-merge lands it when `result` is green,
|
||||
# and the merge publishes the artifacts. A tip that fails to build stays an
|
||||
# unmerged red PR that the next tick supersedes.
|
||||
#
|
||||
# The PR and auto-merge use the PAT in PKGS_BOT_TOKEN so they trigger the
|
||||
# build and publish workflows. The built-in GITHUB_TOKEN cannot drive this
|
||||
# unattended chain. The PAT needs Contents: write and Pull requests: write
|
||||
# on this repository, and its owner must be trusted by the build workflow.
|
||||
|
||||
on:
|
||||
schedule:
|
||||
# Every 2 hours, off the hour to dodge the scheduling backlog at :00
|
||||
- cron: '35 */2 * * *'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
packages:
|
||||
description: 'Specific packages to track (space-separated, leave empty for every auto_merge package)'
|
||||
required: false
|
||||
default: ''
|
||||
|
||||
# One tracker at a time: two runs racing on auto/track-branches would each
|
||||
# force-push their own pin over the other's.
|
||||
concurrency:
|
||||
group: track-branches
|
||||
cancel-in-progress: false
|
||||
|
||||
jobs:
|
||||
track:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
steps:
|
||||
- name: Require the tracking token
|
||||
env:
|
||||
PKGS_BOT_TOKEN: ${{ secrets.PKGS_BOT_TOKEN }}
|
||||
run: |
|
||||
if [[ -z "$PKGS_BOT_TOKEN" ]]; then
|
||||
echo "::error::Set PKGS_BOT_TOKEN to a PAT with Contents: write and Pull requests: write on this repository, owned by an account trusted to trigger builds."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
# Same container as the reviewed sync: vercmp decides whether a pin is
|
||||
# an upgrade with the comparator pacman uses on users' machines.
|
||||
- name: Pin tracked branches to their current tips
|
||||
id: sync
|
||||
run: |
|
||||
docker run --rm \
|
||||
-e PACKAGES="$PACKAGES" \
|
||||
-e UPSTREAM_GITHUB_TOKEN="$UPSTREAM_GITHUB_TOKEN" \
|
||||
-e HOST_UID="$(id -u)" \
|
||||
-e HOST_GID="$(id -g)" \
|
||||
-v "$PWD/bin:/workspace/bin:ro" \
|
||||
-v "$PWD/helpers:/workspace/helpers:ro" \
|
||||
-v "$PWD/pkgbuilds:/workspace/pkgbuilds" \
|
||||
-w /workspace \
|
||||
archlinux:base-devel bash -lc '
|
||||
set -euo pipefail
|
||||
|
||||
pacman -Syu --noconfirm git jq python libarchive
|
||||
|
||||
groupadd -g "$HOST_GID" runner
|
||||
useradd -m -u "$HOST_UID" -g "$HOST_GID" runner
|
||||
chown -R runner:runner /workspace/pkgbuilds
|
||||
|
||||
if [[ -n "${PACKAGES:-}" ]]; then
|
||||
read -r -a package_args <<< "$PACKAGES"
|
||||
runuser -u runner -- ./bin/sync-upstream --lane auto-merge "${package_args[@]}"
|
||||
else
|
||||
runuser -u runner -- ./bin/sync-upstream --lane auto-merge
|
||||
fi
|
||||
'
|
||||
env:
|
||||
PACKAGES: ${{ github.event.inputs.packages }}
|
||||
UPSTREAM_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Check for changes
|
||||
if: ${{ !cancelled() && steps.sync.outcome != 'skipped' }}
|
||||
id: changes
|
||||
run: |
|
||||
if [ -z "$(git status --porcelain)" ]; then
|
||||
echo "has_changes=false" >> "$GITHUB_OUTPUT"
|
||||
else
|
||||
echo "has_changes=true" >> "$GITHUB_OUTPUT"
|
||||
git status --porcelain
|
||||
{
|
||||
echo "### Pinned"
|
||||
git diff --unified=0 -- 'pkgbuilds/*/PKGBUILD' | grep -E '^\+(pkgver|_commit)=' | sed 's/^+/- /'
|
||||
} >> "$GITHUB_STEP_SUMMARY"
|
||||
fi
|
||||
|
||||
# The PR title names what moved, so the merged history reads like a
|
||||
# changelog: "Track upstream branches: omarchy-dev 4.0.0.r6520.g1a2b3c4, ...".
|
||||
- name: Describe the pins
|
||||
if: ${{ !cancelled() && steps.changes.outputs.has_changes == 'true' }}
|
||||
id: describe
|
||||
run: |
|
||||
title=$(git diff --unified=0 -- 'pkgbuilds/*/PKGBUILD' \
|
||||
| awk '/^\+\+\+ b\/pkgbuilds\//{split($2,p,"/"); pkg=p[3]} /^\+pkgver=/{sub(/^\+pkgver=/,""); printf "%s %s, ", pkg, $0}' \
|
||||
| sed 's/, $//')
|
||||
echo "title=Track upstream branches: ${title}" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Open or update the tracking PR
|
||||
if: ${{ !cancelled() && steps.changes.outputs.has_changes == 'true' }}
|
||||
id: pr
|
||||
uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1
|
||||
with:
|
||||
token: ${{ secrets.PKGS_BOT_TOKEN }}
|
||||
commit-message: ${{ steps.describe.outputs.title }}
|
||||
title: ${{ steps.describe.outputs.title }}
|
||||
body: |
|
||||
Automated pin of packages that follow a moving upstream branch
|
||||
(`"auto_merge": true` in `.omarchy/package.json`). Each package's
|
||||
`_commit` now points at the branch tip. Fresh tips wait until
|
||||
their commit timestamp is at least `min_release_age` old.
|
||||
|
||||
This PR auto-merges once the build checks pass. A failing build
|
||||
leaves it open; the next tracker run replaces it with the newer tip.
|
||||
branch: auto/track-branches
|
||||
delete-branch: true
|
||||
labels: automated
|
||||
|
||||
# Auto-merge, not a direct merge: branch protection still has to see
|
||||
# `result`, `self-tests` and `build-isolation` green, and this lane
|
||||
# inherits every rule the reviewed lane has except the human.
|
||||
- name: Enable auto-merge
|
||||
if: ${{ !cancelled() && steps.pr.outputs.pull-request-number != '' }}
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.PKGS_BOT_TOKEN }}
|
||||
PR: ${{ steps.pr.outputs.pull-request-number }}
|
||||
run: |
|
||||
# Idempotent across re-runs of an updated PR: enabling twice errors.
|
||||
if [[ "$(gh pr view "$PR" -R "${{ github.repository }}" --json autoMergeRequest --jq '.autoMergeRequest != null')" == true ]]; then
|
||||
echo "auto-merge already enabled on #$PR"
|
||||
exit 0
|
||||
fi
|
||||
gh pr merge --auto --merge "$PR" -R "${{ github.repository }}"
|
||||
|
||||
- name: Notify Basecamp on failure
|
||||
if: failure() && env.BASECAMP_CHATBOT_URL != ''
|
||||
env:
|
||||
BASECAMP_CHATBOT_URL: ${{ secrets.BASECAMP_CHATBOT_URL }}
|
||||
run: |
|
||||
curl -s -o /dev/null \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "$(jq -n --arg content \
|
||||
"🔴 <strong>Branch tracking failed</strong><br><a href=\"${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}\">View run</a>" \
|
||||
'{content: $content}')" \
|
||||
"$BASECAMP_CHATBOT_URL"
|
||||
@@ -23,6 +23,14 @@ The filesystem no longer encodes release policy. Instead:
|
||||
(`OMARCHY_RC_PINS=1`, which `omarchy-release rc` sets) may build it for rc — master's
|
||||
shipped pins can never overwrite an in-flight RC. The dev pair
|
||||
(`omarchy-dev`, `omarchy-settings-dev`) is pinned to `edge`
|
||||
- packages that follow a moving upstream branch (the dev pair on `quattro`,
|
||||
`omasnap-git` on `main`) still pin an exact commit in their PKGBUILD. A
|
||||
`git_branch` upstream watch moves that pin, and `"auto_merge": true` puts the
|
||||
package on the unattended lane: `track-branches.yml` opens the bump PR every
|
||||
two hours and auto-merges it once the build checks pass, so a branch tip
|
||||
reaches the edge channel without anyone clicking. No PKGBUILD may carry an
|
||||
unpinned git source (`tests/pinned-sources.sh`); a branch that has to be
|
||||
followed gets a watch, not a `#branch=` fragment
|
||||
- Omarchy owns every checked-in recipe; upstream watches update release metadata without replacing packaging or architecture support
|
||||
- packages can opt out of unscoped builds with `skip_build`; explicit `--package` builds remain available
|
||||
- packages follow direct upstream watches/providers in `.omarchy/package.json`, or a custom `.omarchy/upstream.sh` hook
|
||||
@@ -719,6 +727,7 @@ Fields:
|
||||
- `upstream`: optional direct release watch (see [Upstream watches](docs/upstream-sources.md)), or an existing GitHub, git-tag, npm, or Debian provider. GitHub architecture assets may be a string or an ordered array, and can be combined with disjoint versioned `sources` — see [Sync Upstream Releases](#sync-upstream-releases). Mutually exclusive with `.omarchy/upstream.sh`.
|
||||
- `min_release_age`: optional quarantine for upstream releases (`"24h"`, `"2d"`, or bare seconds). The newest release older than the window ships; anything younger waits, and a release whose age cannot be proven fails the sync. Bypass deliberately with `BYPASS_MIN_RELEASE_AGE=1 bin/sync-upstream <package>`.
|
||||
- `sync`: `false` records an existing manual maintenance hold. Held packages have no upstream watch/provider/hook and are excluded from automatic updates.
|
||||
- `auto_merge`: optional boolean; defaults to `false`. `true` moves the package's upstream updates from the reviewed 6-hourly sync PR to the unattended lane: `track-branches.yml` opens its bump PR and auto-merges it when CI is green. Meant for packages that follow a moving branch through a `git_branch` watch, where every tip is a release and there is nothing for a reviewer to read. Requires an upstream watch, provider, or hook.
|
||||
- `origin`: optional historical import provenance, with `aur` (package name) and `commit`. It does not control updates.
|
||||
- `release_ring`: optional. `fast` means the package is built directly for stable as well as edge, with the artifacts replicated into rc for parity. Packages without a ring build in edge and reach stable through the pipeline (`bin/repo advance`).
|
||||
- `channels`: optional array bounding where the package may be built (`edge`, `rc`, `stable`). Without the key a package is a member of every channel and follows the default build rules above; `bin/repo advance` refuses to carry a package anywhere it isn't a member.
|
||||
@@ -880,8 +889,33 @@ The repository includes GitHub workflows and systemd services for automated rele
|
||||
|
||||
#### GitHub Workflows
|
||||
|
||||
1. **sync-upstream.yml** (Every 6 hours): Watches direct upstream feeds and updates owned recipes. Successful package updates reach a PR even if another feed fails; failed recipes stay untouched and the workflow remains red.
|
||||
1. **sync-upstream.yml** (Every 6 hours): Watches direct upstream feeds and updates owned recipes on the reviewed lane. Successful package updates reach a PR even if another feed fails; failed recipes stay untouched and the workflow remains red.
|
||||
2. **sync-rebuilds.yml** (Every 6 hours): Bumps pkgrel for packages whose `rebuild_on` dependencies have moved in the official repositories and opens a PR.
|
||||
3. **track-branches.yml** (Every 2 hours): The unattended lane. Pins every `"auto_merge": true` package to the tip of its watched branch once its commit timestamp clears `min_release_age`, opens one PR for all of them, and enables auto-merge. Packages pinned from the same branch move together or not at all, including targeted syncs. The PR builds like any other; a tip that fails to build stays an open red PR until the next tick supersedes it.
|
||||
|
||||
The tracking PR and auto-merge use the PAT stored in `PKGS_BOT_TOKEN`, with
|
||||
Contents and Pull requests write access to this repository and an owner trusted
|
||||
to trigger builds. The existing controller PAT can be reused. No GitHub App is
|
||||
required. The built-in Actions `GITHUB_TOKEN` cannot drive the unattended
|
||||
build-and-publish chain, so the tracker requires this secret before it runs.
|
||||
The reviewed sync workflows continue to use `GITHUB_TOKEN` and require
|
||||
maintainer approval as before. See [setup instructions](docs/upstream-sources.md#enable-unattended-branch-updates).
|
||||
|
||||
Scheduled runs regenerate one shared PR (`auto/sync-upstream`, `auto/sync-rebuilds`)
|
||||
from master. A manual run with the `packages` input only regenerates those
|
||||
packages, so it opens its own PR on `auto/sync-upstream-<packages>` (or
|
||||
`auto/sync-rebuilds-<packages>`) rather than replacing the shared PR's other
|
||||
pending updates. The next scheduled run still picks the same update up in the
|
||||
shared PR if it has not merged by then; identical package trees reuse the same
|
||||
build artifacts.
|
||||
|
||||
Sync PRs are pushed with `GITHUB_TOKEN`, so GitHub holds their build and test
|
||||
runs for approval on every push and starts no `pull_request_target` workflow
|
||||
for them. Once **`build-approved`** is on a sync PR, the sync workflow's own
|
||||
`approve` job releases the held runs for each commit it pushes. A push to an
|
||||
`auto/sync-*` branch does not cancel the PR's in-flight build: the new build
|
||||
waits for it and then reuses its artifacts, so a long aarch64 build is not
|
||||
restarted by every sync.
|
||||
|
||||
To approve builds for an unvouched contributor's PR, apply **`build-approved`**.
|
||||
Until approval, the PR shows **Awaiting build approval** and its required
|
||||
|
||||
+134
-5
@@ -12,6 +12,7 @@ trap 'rm -rf "$TEMP_DIR"' EXIT
|
||||
export UPSTREAM_CACHE_DIR="$TEMP_DIR/watch-cache"
|
||||
|
||||
SPECIFIC_PACKAGES=()
|
||||
LANE=all
|
||||
|
||||
usage() {
|
||||
cat <<EOF
|
||||
@@ -49,6 +50,14 @@ the bypass, so the resulting change still goes through a reviewed PR.
|
||||
Arguments:
|
||||
PACKAGE One or more package names to update (optional)
|
||||
|
||||
Options:
|
||||
--lane <reviewed|auto-merge|all>
|
||||
Which delivery lane to sync (default: all). Packages marked
|
||||
"auto_merge": true ride the unattended lane (the branch tracker
|
||||
opens and auto-merges their PR); everything else is reviewed.
|
||||
The scheduled workflows each pass their own lane so a moving
|
||||
branch tip never waits on a vendor release, or the reverse.
|
||||
|
||||
Commands:
|
||||
self-test Run the offline fixture tests for release selection, the
|
||||
quarantine backstop, and metadata parsing
|
||||
@@ -65,6 +74,14 @@ while [[ $# -gt 0 ]]; do
|
||||
usage
|
||||
exit 0
|
||||
;;
|
||||
--lane)
|
||||
LANE="${2:-}"
|
||||
case "$LANE" in
|
||||
reviewed|auto-merge|all) ;;
|
||||
*) print_error "Invalid --lane '$LANE' (expected reviewed, auto-merge, or all)"; exit 1 ;;
|
||||
esac
|
||||
shift 2
|
||||
;;
|
||||
--*)
|
||||
print_error "Unknown option: $1"
|
||||
exit 1
|
||||
@@ -141,17 +158,22 @@ set_pkgbuild_array() {
|
||||
|
||||
local rewritten="$TEMP_DIR/pkgbuild-rewritten"
|
||||
if ! awk -v prefix="${name}=(" -v block="$block" '
|
||||
# The code on a line, minus any comment. Checksum arrays hold quoted hex
|
||||
# (or SKIP), so a "#" can only ever start a comment here.
|
||||
function code(s) { sub(/#.*/, "", s); return s }
|
||||
!replaced && index($0, prefix) == 1 {
|
||||
while ((getline line < block) > 0) print line
|
||||
close(block)
|
||||
replaced = 1
|
||||
# A ")" anywhere past the opening closes the array; testing for one at end
|
||||
# of line instead would treat a trailing comment as a continuation and eat
|
||||
# every line up to the next ")".
|
||||
if (index(substr($0, length(prefix) + 1), ")") == 0) skipping = 1
|
||||
# every line up to the next ")". A ")" inside a comment -- "# sidecar
|
||||
# (new in v0.7.5)" -- closes nothing, and ending the skip there would
|
||||
# leave the rest of the old array behind a stray ")".
|
||||
if (index(code(substr($0, length(prefix) + 1)), ")") == 0) skipping = 1
|
||||
next
|
||||
}
|
||||
skipping { if ($0 ~ /\)/) skipping = 0; next }
|
||||
skipping { if (code($0) ~ /\)/) skipping = 0; next }
|
||||
{ print }
|
||||
' "$pkgbuild" > "$rewritten"; then
|
||||
print_error "Failed to rewrite ${name} in $pkgbuild"
|
||||
@@ -945,6 +967,29 @@ EOF
|
||||
vst=0; validate_package_metadata "$npmpkg" >/dev/null || vst=$?
|
||||
check "npm declaration validates" "0" "$vst"
|
||||
|
||||
# A ")" in a comment inside a checksum array must not end the rewrite early;
|
||||
# voxtype-bin annotates its arrays with "(new in v0.7.5)" and the like.
|
||||
echo "Checksum array rewrite across commented lines:"
|
||||
local commented="$TEMP_DIR/commented-pkgbuild" sum_c=$(printf 'c%.0s' {1..64})
|
||||
cat > "$commented" <<'EOF'
|
||||
sha256sums_x86_64=(
|
||||
# Binaries
|
||||
'aaaa' # tool
|
||||
# Sidecar (new in v0.7.5)
|
||||
'bbbb' # sidecar (x86_64)
|
||||
)
|
||||
sha256sums=( # support files (arch-independent)
|
||||
'dddd'
|
||||
)
|
||||
package() { :; }
|
||||
EOF
|
||||
set_pkgbuild_array "$commented" sha256sums_x86_64 "$sum_c" "$sum_c"
|
||||
set_pkgbuild_array "$commented" sha256sums "$sum_c"
|
||||
check "commented arrays rewrite to valid shell" "0" \
|
||||
"$(bash -n "$commented" 2>/dev/null; echo $?)"
|
||||
check "commented arrays hold only the new checksums" "$sum_c $sum_c|$sum_c|package" \
|
||||
"$(bash -c 'source "$1"; printf "%s|%s|%s" "${sha256sums_x86_64[*]}" "${sha256sums[*]}" "$(declare -F package)"' _ "$commented")"
|
||||
|
||||
# End to end over the real mise-bin package: its checked-in metadata and
|
||||
# PKGBUILD, the full sync_package path (selection, validation, backstop,
|
||||
# rewrite, read-back verification), with only the two network fetches
|
||||
@@ -1014,16 +1059,100 @@ if [[ ${#SPECIFIC_PACKAGES[@]} -gt 0 && "${SPECIFIC_PACKAGES[0]}" == "self-test"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Packages that pin the same upstream branch move together or not at all.
|
||||
# The watch reads one shared clone per run, so they only disagree when one
|
||||
# package's update failed after the tip was chosen (a checksum fetch, say).
|
||||
# Leaving the other one advanced would ship omarchy-dev and
|
||||
# omarchy-settings-dev from different commits, which is exactly the skew the
|
||||
# release pair's lockstep guard exists to prevent. Restore the packages that
|
||||
# moved and count the group as failed; the next run tries again.
|
||||
declare -A BEFORE_SYNC=()
|
||||
|
||||
snapshot_package() {
|
||||
local package="$1" pkgbuild="$PKGBUILDS_DIR/$1/PKGBUILD"
|
||||
[[ -f "$pkgbuild" ]] || return 0
|
||||
mkdir -p "$TEMP_DIR/before"
|
||||
cp "$pkgbuild" "$TEMP_DIR/before/$package"
|
||||
BEFORE_SYNC["$package"]=1
|
||||
}
|
||||
|
||||
branch_watch_key() {
|
||||
local package_dir="$1"
|
||||
jq -r '
|
||||
(.upstream.watch? | objects | select(has("git_branch")))
|
||||
| "\(.git_branch)#\(.branch)"
|
||||
' "$package_dir/.omarchy/package.json" 2>/dev/null
|
||||
}
|
||||
|
||||
enforce_branch_lockstep() {
|
||||
local package key
|
||||
declare -A groups=()
|
||||
for package in "${!BEFORE_SYNC[@]}"; do
|
||||
key=$(branch_watch_key "$PKGBUILDS_DIR/$package")
|
||||
[[ -n "$key" ]] || continue
|
||||
groups["$key"]+="$package "
|
||||
done
|
||||
for key in "${!groups[@]}"; do
|
||||
local members commits pin
|
||||
read -r -a members <<<"${groups[$key]}"
|
||||
(( ${#members[@]} > 1 )) || continue
|
||||
commits=$(for package in "${members[@]}"; do
|
||||
pin=$(grep -m1 -E '^_commit=' "$PKGBUILDS_DIR/$package/PKGBUILD" | cut -d= -f2- | tr -d "\"'" || true)
|
||||
printf '%s\n' "${pin:-missing:$package}"
|
||||
done | sort -u | grep -c .)
|
||||
(( commits > 1 )) || continue
|
||||
print_error "Lockstep violation on $key: ${members[*]} pin different commits; restoring all of them"
|
||||
for package in "${members[@]}"; do
|
||||
if ! cmp -s "$TEMP_DIR/before/$package" "$PKGBUILDS_DIR/$package/PKGBUILD"; then
|
||||
cp "$TEMP_DIR/before/$package" "$PKGBUILDS_DIR/$package/PKGBUILD"
|
||||
# Not ((--UPDATED)): an arithmetic command that evaluates to zero
|
||||
# returns 1, and under errexit that would end the run right here.
|
||||
UPDATED=$((UPDATED > 0 ? UPDATED - 1 : 0))
|
||||
fi
|
||||
done
|
||||
((++FAILED))
|
||||
done
|
||||
}
|
||||
|
||||
sync_in_lane() {
|
||||
local package="$1" package_dir="$PKGBUILDS_DIR/$1"
|
||||
snapshot_package "$package"
|
||||
if [[ -d "$package_dir" ]] && ! package_in_lane "$package_dir" "$LANE"; then
|
||||
print_info "Skipping $package: not in the $LANE lane"
|
||||
((++SKIPPED))
|
||||
return 0
|
||||
fi
|
||||
sync_package "$package"
|
||||
}
|
||||
|
||||
if [[ ${#SPECIFIC_PACKAGES[@]} -gt 0 ]]; then
|
||||
SPECIFIC_MODE=true
|
||||
# A targeted run is still a branch update: include every sibling watching
|
||||
# the same branch, otherwise the lockstep check never sees the omitted one.
|
||||
declare -A selected=() selected_branches=()
|
||||
for package in "${SPECIFIC_PACKAGES[@]}"; do
|
||||
sync_package "$package"
|
||||
selected["$package"]=1
|
||||
key=$(branch_watch_key "$PKGBUILDS_DIR/$package" || true)
|
||||
[[ -z "$key" ]] || selected_branches["$key"]=1
|
||||
done
|
||||
for package_dir in "$PKGBUILDS_DIR"/*; do
|
||||
[[ -f "$package_dir/PKGBUILD" ]] || continue
|
||||
package=${package_dir##*/}
|
||||
[[ -z "${selected[$package]:-}" ]] || continue
|
||||
key=$(branch_watch_key "$package_dir" || true)
|
||||
if [[ -n "$key" && -n "${selected_branches[$key]:-}" ]]; then
|
||||
SPECIFIC_PACKAGES+=("$package")
|
||||
fi
|
||||
done
|
||||
for package in "${SPECIFIC_PACKAGES[@]}"; do
|
||||
sync_in_lane "$package"
|
||||
done
|
||||
else
|
||||
while IFS= read -r package; do
|
||||
sync_package "$package"
|
||||
sync_in_lane "$package"
|
||||
done < <(packages_for_upstream_sync)
|
||||
fi
|
||||
enforce_branch_lockstep
|
||||
|
||||
echo ""
|
||||
if [[ $FAILED -gt 0 ]]; then
|
||||
|
||||
+7
-3
@@ -6,8 +6,9 @@ signing on merge exactly as before.
|
||||
## Pieces
|
||||
|
||||
- `.github/workflows/build-pr.yml` — on a PR touching `pkgbuilds/**`, one job
|
||||
per changed package on runners labelled `omarchy-builder`. Uploads the
|
||||
unsigned `.pkg.tar.zst` as a workflow artifact (7 days).
|
||||
per changed package on runners labelled `omarchy-builder`. aarch64 jobs
|
||||
run on GitHub's native `ubuntu-24.04-arm` runners instead. Uploads the unsigned
|
||||
`.pkg.tar.zst` as a workflow artifact (7 days).
|
||||
- `runner-cloud-init.yaml` — Ubuntu 24.04 user-data: docker + buildx, the
|
||||
GitHub runner registered `--ephemeral`, runs one job, powers off.
|
||||
- `controller.sh` — systemd timer every minute on a small always-on droplet.
|
||||
@@ -67,7 +68,10 @@ Watch it with `journalctl -u omarchy-controller -f` on the box.
|
||||
- Publish is incremental and immutable: pull the channel db, refuse
|
||||
different bytes under an existing name, accept identical bytes, upload
|
||||
packages then signatures then the db.
|
||||
- aarch64 under QEMU with credential-preserving binfmt.
|
||||
- aarch64 under QEMU with credential-preserving binfmt. PR builds now run
|
||||
aarch64 natively on `ubuntu-24.04-arm` (QEMU was up to ~15x slower). When a
|
||||
merged aarch64 tree has no artifact, publish.yml rebuilds it there too, in its
|
||||
own job, and signs and uploads it on the droplet like a PR artifact.
|
||||
- Vouch gate: collaborators, `.github/VOUCHED.td`, or the `build-approved`
|
||||
label; denounced authors cannot be overridden by the label.
|
||||
- Tests run on PRs only; `result`, `self-tests`, `build-isolation` are the
|
||||
|
||||
@@ -48,8 +48,63 @@ pkgrel to 1, but the complete epoch:pkgver-pkgrel must still increase.
|
||||
|
||||
GitHub releases exclude drafts and prereleases unless `allow_prerelease` is true.
|
||||
Existing `min_release_age` policies apply: a feed without a verifiable publication
|
||||
time cannot bypass a configured hold. Git branch watches derive a commit count
|
||||
and date from the actual branch history and write an immutable source pin.
|
||||
time cannot bypass a configured hold.
|
||||
|
||||
## Branch watches
|
||||
|
||||
A `git_branch` watch treats every commit on a branch as a release and writes an
|
||||
immutable pin (`"_commit": "{commit}"`) so the recipe never carries a moving
|
||||
`#branch=` source; `tests/pinned-sources.sh` enforces that. The clone is bare,
|
||||
blobless and single-branch, read only with git, and shared by every package
|
||||
that watches the same branch in one run, so two recipes pinned from it always
|
||||
see the same commit. Values available to `version`:
|
||||
|
||||
- `{date}` (default), `{count}` (commits on the branch), `{commit}`
|
||||
(`{commit:.7}` for the short form)
|
||||
- with `tag_pattern` (a regular expression with a named `version` group,
|
||||
matched against whole tags): `{tag}`, `{version}` from that tag, and
|
||||
`{distance}`, the number of commits past it. Only tags in the pinned
|
||||
commit's own history count, so a release cut on another branch is ignored.
|
||||
|
||||
`{version}.r{distance}.g{commit:.7}` gives `1.21.0.r15.gabc1234`, which pacman
|
||||
orders above the `1.21.0` release it follows and below `1.21.1`; `omasnap-git`
|
||||
uses it. The Omarchy dev pair uses `{version}.r{count}.g{commit:.7}` instead
|
||||
because its published history counted every commit and the number must never
|
||||
go down.
|
||||
|
||||
`min_release_age` holds a branch tip until its commit timestamp is old enough.
|
||||
A fresh tip leaves the existing pin alone; the watch never walks backward to
|
||||
an older commit. This uses Git's committer date, not the time a commit was
|
||||
pushed. `BYPASS_MIN_RELEASE_AGE=1` bypasses the hold.
|
||||
|
||||
Packages marked `"auto_merge": true` ride the unattended lane
|
||||
(`track-branches.yml`) instead of the reviewed sync PR: their bump PR is opened
|
||||
and auto-merged as soon as the build checks pass. `bin/sync-upstream --lane
|
||||
reviewed|auto-merge|all` selects a lane; the scheduled workflows each pass their
|
||||
own. Packages that pin the same branch move in lockstep: if one of them fails
|
||||
to update, the run restores the others and reports the group as failed. A
|
||||
targeted sync includes the other packages watching that branch, so requesting
|
||||
only `omarchy-dev` also updates `omarchy-settings-dev`.
|
||||
|
||||
### Enable unattended branch updates
|
||||
|
||||
The schedule already runs in GitHub Actions; no server cron job is needed.
|
||||
It uses a personal access token so its PRs trigger builds and its merges trigger
|
||||
publishing without manual approval. No GitHub App is required.
|
||||
|
||||
1. Use a fine-grained PAT with access to **omacom/omarchy-pkgs** and repository
|
||||
**Contents: Read and write** and **Pull requests: Read and write** permissions.
|
||||
Its owner must be trusted by the build workflow (for example, a collaborator).
|
||||
The existing controller PAT can be reused when it has these permissions.
|
||||
2. In the repository's
|
||||
[Actions secrets](https://github.com/omacom/omarchy-pkgs/settings/secrets/actions),
|
||||
save the PAT as `PKGS_BOT_TOKEN`. Update this secret when the token is rotated
|
||||
or expires. The built-in Actions `GITHUB_TOKEN` cannot run this unattended chain.
|
||||
3. Keep **Allow auto-merge** enabled and require `result`, `self-tests`, and
|
||||
`build-isolation` on `master`; the tracker does not request a protection bypass.
|
||||
4. After merging the tracker, run **Track upstream branches** once from Actions
|
||||
to verify that its PR builds, auto-merges, and starts **Publish merged packages**.
|
||||
Subsequent runs happen every two hours.
|
||||
|
||||
Checksums retain their algorithms (SHA256, SHA512, BLAKE2, etc.) and source order.
|
||||
Changed git sources are hashed with makepkg's git-archive convention. Unchanged
|
||||
@@ -131,6 +186,8 @@ in `origin` and has no effect on release selection.
|
||||
| `localsend` | github | [localsend/localsend](https://github.com/localsend/localsend) |
|
||||
| `localsend-bin` | github | [localsend/localsend](https://github.com/localsend/localsend) |
|
||||
| `macbook12-spi-driver-dkms` | git_branch | [https://github.com/marc-git/macbook12-spi-driver.git](https://github.com/marc-git/macbook12-spi-driver.git) |
|
||||
| `omarchy-dev`, `omarchy-settings-dev` | git_branch (auto-merge) | [https://github.com/basecamp/omarchy.git](https://github.com/basecamp/omarchy.git) `quattro` |
|
||||
| `omasnap-git` | git_branch (auto-merge) | [https://github.com/omacom/omasnap.git](https://github.com/omacom/omasnap.git) `main` |
|
||||
| `makima-bin` | github | [cyber-sushi/makima](https://github.com/cyber-sushi/makima) |
|
||||
| `minecraft-launcher` | archive | [https://launcher.mojang.com/download/Minecraft.deb](https://launcher.mojang.com/download/Minecraft.deb) |
|
||||
| `nautilus-dropbox` | github | [dropbox/nautilus-dropbox](https://github.com/dropbox/nautilus-dropbox) |
|
||||
@@ -170,6 +227,8 @@ These packages were already excluded from automatic AUR updates. The migration p
|
||||
|
||||
`linux-firmware-cirrus` is a deliberate hold: a self-retiring shim that ships Arch's linux-firmware-cirrus 20260910-2 payload to stable while stable's Arch snapshot is on 20260810-2 (Dell XPS 13 DX13260 / 1028:0e54 speaker firmware). It is versioned 20260810-3 so the genuine Arch package supersedes it as soon as the snapshot advances; bumping it to the Arch version would defeat that. Delete the recipe once stable's snapshot carries linux-firmware >= 20260910.
|
||||
|
||||
`m1n1-aurora` and `uboot-asahi` are deliberate holds: Apple Silicon boot code, pinned by hand like `linux-aurora`, and bumped only after a cold boot on the qualification Macs. `m1n1-aurora` pins an aurora-silicon/m1n1 commit plus a local patch. `uboot-asahi` follows asahi-alarm's recipe and patch set (asahi-alarm/PKGBUILDs), which a tag watch on AsahiLinux/u-boot cannot carry.
|
||||
|
||||
## Package-specific boundaries
|
||||
|
||||
- NVIDIA watches remain on the 580 driver branch.
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
# { "source": "local", "channels": ["edge"] }
|
||||
# { "source": "local", "channels": ["edge", "rc", "stable"] }
|
||||
# { "source": "local", "min_release_age": "24h" }
|
||||
# { "source": "local", "auto_merge": true, "upstream": { "watch": { "git_branch": "...", "branch": "main" } } }
|
||||
# { "source": "local", "upstream": { "github": "owner/repo", "checksums": "SHASUMS256.txt", "assets": { "x86_64": ["name-{tag}-x64.tar.xz"] } } }
|
||||
# { "source": "local", "upstream": { "github": "owner/repo", "digests": true, "assets": { "x86_64": "name-{tag}-x64.tar.xz" } } }
|
||||
# { "source": "local", "upstream": { "git_tags": "https://example/repo.git", "tag_pattern": "v{pkgver}", "sources": { "any": ["https://example/archive/{tag}.tar.gz"] } } }
|
||||
@@ -327,6 +328,31 @@ packages_for_upstream_sync() {
|
||||
done
|
||||
}
|
||||
|
||||
# Upstream updates travel in one of two lanes. The reviewed lane is the
|
||||
# 6-hourly sync PR a maintainer reads before merging. A package that marks
|
||||
# "auto_merge": true rides the unattended lane instead: its bump PR is opened
|
||||
# and auto-merged by the branch tracker as soon as CI is green, which is how a
|
||||
# package that follows a moving branch (omarchy-dev, omasnap-git) gets rebuilt
|
||||
# without anyone clicking. The lanes are disjoint so a branch tip can never
|
||||
# hold up a reviewed vendor release, or the other way round.
|
||||
package_auto_merge() {
|
||||
local pkgdir="$1" metadata
|
||||
metadata=$(metadata_file_for_dir "$pkgdir")
|
||||
[[ -f "$metadata" ]] || return 1
|
||||
[[ "$(jq -r 'if has("auto_merge") then .auto_merge else false end' "$metadata")" == "true" ]]
|
||||
}
|
||||
|
||||
# package_in_lane <pkgdir> <reviewed|auto-merge|all>
|
||||
package_in_lane() {
|
||||
local pkgdir="$1" lane="$2"
|
||||
case "$lane" in
|
||||
all | "") return 0 ;;
|
||||
auto-merge) package_auto_merge "$pkgdir" ;;
|
||||
reviewed) ! package_auto_merge "$pkgdir" ;;
|
||||
*) echo "invalid lane: $lane (expected reviewed, auto-merge, or all)" >&2; return 2 ;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Packages that must be rebuilt when a dependency they link against changes,
|
||||
# even though nothing in their own source moved. `rebuild_on` names those
|
||||
# dependencies; `rebuilt_against` records the versions the checked-in pkgrel was
|
||||
@@ -514,6 +540,15 @@ validate_package_metadata() {
|
||||
return 1
|
||||
fi
|
||||
|
||||
if ! jq -e 'if has("auto_merge") | not then true else (.auto_merge | type) == "boolean" end' "$metadata" >/dev/null; then
|
||||
echo "invalid auto_merge for $(basename "$pkgdir"): must be boolean"
|
||||
return 1
|
||||
fi
|
||||
if package_auto_merge "$pkgdir" && ! package_has_upstream_provider "$pkgdir" && ! package_has_upstream_hook "$pkgdir"; then
|
||||
echo "invalid auto_merge for $(basename "$pkgdir"): only an upstream watch, provider, or hook can be auto-merged"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# `has` rather than `// {}`: jq's // treats false as absent, which would
|
||||
# let "upstream": false slip through as an empty declaration.
|
||||
if ! jq -e '
|
||||
|
||||
@@ -82,7 +82,7 @@ def validate(watch):
|
||||
allowed = PROVIDERS | {"pattern", "path", "package", "branch", "variables", "fields",
|
||||
"submodules", "allow_prerelease", "unescape_json", "filenames",
|
||||
"sequence", "version", "revision", "revision_variable",
|
||||
"mutable_sources", "member", "dist_tag"}
|
||||
"mutable_sources", "member", "dist_tag", "tag_pattern"}
|
||||
if watch.keys() - allowed:
|
||||
raise ValueError(f"unknown watch fields: {sorted(watch.keys() - allowed)}")
|
||||
value = watch[provider]
|
||||
@@ -113,6 +113,18 @@ def validate(watch):
|
||||
if not isinstance(branch, str) or not branch or branch.startswith("-"):
|
||||
raise ValueError("git branch watch needs an explicit branch")
|
||||
run(["git", "check-ref-format", "refs/heads/" + branch])
|
||||
# A branch watch whose version template names a tag needs to know
|
||||
# which tags count as releases; anything else is an untagged branch.
|
||||
if "tag_pattern" in watch:
|
||||
if not isinstance(watch["tag_pattern"], str) or not watch["tag_pattern"]:
|
||||
raise ValueError("watch.tag_pattern must be a regular expression string")
|
||||
if "version" not in re.compile(watch["tag_pattern"]).groupindex:
|
||||
raise ValueError("tag_pattern needs a named version group")
|
||||
template = watch.get("version", "{version}")
|
||||
if any(field in template for field in ("{tag", "{distance")) and "tag_pattern" not in watch:
|
||||
raise ValueError("a version built from {tag}/{distance} needs a tag_pattern")
|
||||
elif "tag_pattern" in watch:
|
||||
raise ValueError("tag_pattern only applies to git_branch watches")
|
||||
for field in ("variables", "submodules", "fields"):
|
||||
mapping = watch.get(field, {})
|
||||
if not isinstance(mapping, dict):
|
||||
@@ -172,6 +184,53 @@ def matches(watch, text, extra=None, full=False):
|
||||
yield candidate(watch, {**(extra or {}), **match.groupdict()})
|
||||
|
||||
|
||||
def git_branch_tip(url, branch, tag_pattern, cache):
|
||||
"""Describe the current tip of an upstream branch:
|
||||
commit, total count, date, and with a tag_pattern
|
||||
the newest release tag reachable from it plus the distance from that tag,
|
||||
so a branch build can be versioned <tag>.r<n>.g<sha>, above the release it
|
||||
follows and below the next one, the way a pkgver() function would.
|
||||
|
||||
One blobless single-branch clone per (url, branch) per run, shared by
|
||||
every package that tracks it, so two recipes pinned from one clone always
|
||||
see the same commit. The clone is read with git only; nothing in it runs.
|
||||
select_release applies the age hold to this tip, without walking back
|
||||
into history (which could select a commit from a merged side branch).
|
||||
"""
|
||||
https(url)
|
||||
key = hashlib.sha256(f"{url}#{branch}".encode()).hexdigest()
|
||||
work = Path(cache) / f"{key}.branch.git"
|
||||
if not work.exists():
|
||||
scratch = work.with_name(f"{work.name}.{os.getpid()}.tmp")
|
||||
subprocess.run(["git", "clone", "--quiet", "--bare", "--filter=blob:none", "--single-branch", "--branch", branch, url, str(scratch)], check=True)
|
||||
scratch.replace(work)
|
||||
git = ["git", "-C", str(work)]
|
||||
commit = run([*git, "rev-parse", "HEAD"], text=True).strip()
|
||||
if not re.fullmatch(r"[0-9a-f]{40}", commit):
|
||||
raise ValueError("branch tip is not a commit")
|
||||
count = run([*git, "rev-list", "--count", commit], text=True).strip()
|
||||
date = run([*git, "show", "-s", "--format=%cs", commit], text=True).strip().replace("-", "")
|
||||
timestamp = run([*git, "show", "-s", "--format=%cI", commit], text=True).strip()
|
||||
values = {"version": date, "date": date, "count": count, "commit": commit, "published_at": timestamp}
|
||||
if tag_pattern:
|
||||
pattern = re.compile(tag_pattern)
|
||||
best = None
|
||||
# Only tags in this commit's history count; a release cut on another
|
||||
# branch is not something this branch is "past".
|
||||
for tag in run([*git, "tag", "--merged", commit], text=True).split():
|
||||
match = pattern.fullmatch(tag)
|
||||
if not match:
|
||||
continue
|
||||
version = match.group("version")
|
||||
if best is None or vercmp(version, best[0]) > 0:
|
||||
best = (version, tag)
|
||||
if best is None:
|
||||
raise ValueError(f"no tag on {branch} matches {tag_pattern}")
|
||||
distance = run([*git, "rev-list", "--count", f"{best[1]}..{commit}"], text=True).strip()
|
||||
values.update({"tag": best[1], "version": best[0], "distance": distance})
|
||||
return values
|
||||
|
||||
|
||||
def discover(watch, fetch):
|
||||
provider = validate(watch)
|
||||
feed = watch[provider]
|
||||
@@ -199,13 +258,8 @@ def discover(watch, fetch):
|
||||
for tag, commit in tags.items():
|
||||
results.extend(matches(watch, tag, {"tag": tag, "commit": commit}, full=True))
|
||||
elif provider == "git_branch":
|
||||
with tempfile.TemporaryDirectory(prefix="upstream-git-") as work:
|
||||
subprocess.run(["git", "clone", "--quiet", "--bare", "--filter=blob:none", "--single-branch", "--branch", watch["branch"], feed, work], check=True)
|
||||
commit = run(["git", "-C", work, "rev-parse", "HEAD"], text=True).strip()
|
||||
count = run(["git", "-C", work, "rev-list", "--count", "HEAD"], text=True).strip()
|
||||
date = run(["git", "-C", work, "show", "-s", "--format=%cs", "HEAD"], text=True).strip().replace("-", "")
|
||||
timestamp = run(["git", "-C", work, "show", "-s", "--format=%cI", "HEAD"], text=True).strip()
|
||||
results.append(candidate(watch, {"version": date, "date": date, "count": count, "commit": commit, "published_at": timestamp}))
|
||||
tip = git_branch_tip(feed, watch["branch"], watch.get("tag_pattern"), fetch.cache)
|
||||
results.append(candidate(watch, tip))
|
||||
elif provider == "npm":
|
||||
data = fetch.json("https://registry.npmjs.org/" + quote(feed, safe=""))
|
||||
version = data["dist-tags"][watch.get("dist_tag", "latest")]
|
||||
@@ -479,7 +533,8 @@ def sync(package, fetch, min_age=0, check=False):
|
||||
path = package / "PKGBUILD"
|
||||
original = path.read_text()
|
||||
before = read_recipe(path)
|
||||
release = select_release(discover(watch, fetch), min_age, bypass=os.environ.get("BYPASS_MIN_RELEASE_AGE") == "1")
|
||||
bypass = os.environ.get("BYPASS_MIN_RELEASE_AGE") == "1"
|
||||
release = select_release(discover(watch, fetch), min_age, bypass=bypass)
|
||||
if release is None:
|
||||
return {"status": "skipped", "reason": "minimum release age"}
|
||||
current = scalar(before, "pkgver")
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
pkgname=1password-beta
|
||||
|
||||
_tarver=8.12.38-25.BETA
|
||||
_tarver=8.12.40-23.BETA
|
||||
case "${CARCH}" in
|
||||
x86_64)
|
||||
_archdir="x64"
|
||||
@@ -9,8 +9,8 @@ case "${CARCH}" in
|
||||
_archdir="arm64"
|
||||
;;
|
||||
esac
|
||||
pkgver=8.12.38_25.BETA
|
||||
pkgrel=25.2
|
||||
pkgver=8.12.40_23.BETA
|
||||
pkgrel=1
|
||||
conflicts=('1password' '1password-beta-bin')
|
||||
pkgdesc="Password manager and secure wallet"
|
||||
arch=('x86_64' 'aarch64')
|
||||
@@ -22,10 +22,8 @@ source=()
|
||||
sha256sums=()
|
||||
source_x86_64=(https://downloads.1password.com/linux/tar/beta/x86_64/1password-${_tarver}.x64.tar.gz{,.sig})
|
||||
source_aarch64=(https://downloads.1password.com/linux/tar/beta/aarch64/1password-${_tarver}.arm64.tar.gz{,.sig})
|
||||
sha256sums_x86_64=('c6d302a2c7404a7ded34a3c4f1c401a43eafeed8b147d128dcb416284c2c2b71'
|
||||
'cc0f00054749c32d77fba31a12a8dece812e409f4b9d81850d2f9b50fab55dca')
|
||||
sha256sums_aarch64=('1fd62cd0df90098dd5e50d22e9a6c0a5221f9db6355b7c848db7af7076b395fd'
|
||||
'4d273b71ab987dcadad9e4fa7cfac7e0173dc4dbe7908c9a3e76af274313dd76')
|
||||
sha256sums_x86_64=('dc1e21c2a6589dacbbb6d56901fdf2bc8c294fd18766a299aca8b84d9f396dcb' 'df3042ed9e897f32888a51447cf0bc977eef130954e7e34f203d96ab036f995a')
|
||||
sha256sums_aarch64=('a1153234abe0f9b7ccbf2d713be548cfd3a66e9fc487efbc42a72fd2d9e6dbbf' 'ae3c9954fcf43b08f50a4ef6429311c80b2605d321fade6643aa1a28a61c0a2a')
|
||||
validpgpkeys=('3FEF9748469ADBE15DA7CA80AC2D62742012EA22')
|
||||
|
||||
package() {
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"source": "local",
|
||||
"channels": [
|
||||
"edge"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
From 375e80ec3826b54618fdd5f2db708c0f2bb936ae Mon Sep 17 00:00:00 2001
|
||||
From: Marcelo Alcantara <maralc@gmail.com>
|
||||
Date: Wed, 16 Sep 2026 00:39:04 +1000
|
||||
Subject: [PATCH] drm: re-read possible CRTCs when rescanning connectors
|
||||
|
||||
A driver can change a connector's possible CRTCs at runtime. Apple's DCP
|
||||
driver narrows a Type-C port's encoder to the display pipeline the fabric
|
||||
routed it to and relies on the following hotplug for userspace to re-read
|
||||
it. possibleCrtcs was only read when the connector was first created, so a
|
||||
rerouted port kept a stale mask and was never assigned its now-free CRTC
|
||||
until the compositor restarted.
|
||||
---
|
||||
src/backend/drm/DRM.cpp | 7 +++++++
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
diff --git a/src/backend/drm/DRM.cpp b/src/backend/drm/DRM.cpp
|
||||
index 6618a26..b492dac 100644
|
||||
--- a/src/backend/drm/DRM.cpp
|
||||
+++ b/src/backend/drm/DRM.cpp
|
||||
@@ -1287,6 +1287,13 @@ void Aquamarine::CDRMBackend::scanConnectors() {
|
||||
} else {
|
||||
backend->log(AQ_LOG_DEBUG, std::format("drm: Connector id {} already initialized", connectorID));
|
||||
conn = *it;
|
||||
+
|
||||
+ // drivers may narrow or widen these on hotplug, e.g. when a Type-C port is rerouted to another pipeline
|
||||
+ const auto possibleCrtcs = drmModeConnectorGetPossibleCrtcs(gpu->fd, drmConn);
|
||||
+ if (possibleCrtcs && possibleCrtcs != conn->possibleCrtcs) {
|
||||
+ backend->log(AQ_LOG_DEBUG, std::format("drm: Connector {} possible CRTCs changed {:#x} -> {:#x}", conn->szName, conn->possibleCrtcs, possibleCrtcs));
|
||||
+ conn->possibleCrtcs = possibleCrtcs;
|
||||
+ }
|
||||
}
|
||||
|
||||
conn->status = drmConn->connection;
|
||||
--
|
||||
2.50.1 (Apple Git-155)
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
# Maintainer: Caleb Maclennan <caleb@alerque.com>
|
||||
# Contributor: Aaron Blasko <blaskoazzolaaaron [at] gmail.com>
|
||||
#
|
||||
# Arch's aquamarine 0.15.1-1 plus one patch, carried on edge for Apple Silicon:
|
||||
# re-read a connector's possible CRTCs when rescanning, so a Type-C port the
|
||||
# DCP fabric reroutes to another display pipeline gets a CRTC without
|
||||
# restarting the compositor. Drop the carry once hyprwm releases the fix.
|
||||
|
||||
pkgname=aquamarine
|
||||
pkgver=0.15.1
|
||||
pkgrel=1.1
|
||||
pkgdesc='a very light linux rendering backend library'
|
||||
arch=(aarch64)
|
||||
url="https://github.com/hyprwm/$pkgname"
|
||||
license=(BSD-3-Clause)
|
||||
depends=(libgcc
|
||||
libstdc++
|
||||
glibc # libc.so libm.so
|
||||
hyprutils libhyprutils.so
|
||||
libdisplay-info libdisplay-info.so
|
||||
libdrm # libdrm.so
|
||||
libglvnd libEGL.so
|
||||
libinput # libinput.so
|
||||
mesa # libgbm.so
|
||||
opengl-driver
|
||||
pixman
|
||||
seatd libseat.so
|
||||
systemd-libs libudev.so
|
||||
wayland libwayland-client.so
|
||||
wayland-protocols)
|
||||
makedepends=(cmake
|
||||
hyprwayland-scanner)
|
||||
provides=("lib$pkgname.so")
|
||||
_archive="$pkgname-$pkgver"
|
||||
source=("$url/archive/v$pkgver/$_archive.tar.gz"
|
||||
0001-drm-re-read-possible-CRTCs-when-rescanning-connectors.patch)
|
||||
sha256sums=('2f9de98c0bd1b7b1b09c576e390a2fef436449762fb334163c414f0c300296f2'
|
||||
'50e9e38ff915b18074dc9b5dd1d07d7f24e340e99f254476d6abe578eece7864')
|
||||
|
||||
prepare() {
|
||||
cd "$_archive"
|
||||
patch -Np1 -i ../0001-drm-re-read-possible-CRTCs-when-rescanning-connectors.patch
|
||||
}
|
||||
|
||||
build() {
|
||||
cd "$_archive"
|
||||
# cc1plus needs more than 8 MiB of stack for DRM.cpp. GCC raises its own
|
||||
# limit natively, but under QEMU user-mode emulation (the aarch64 builder)
|
||||
# the guest stack is fixed at exec and setrlimit is ignored, so the compiler
|
||||
# segfaults. QEMU reads this at exec; native builds ignore it. The object
|
||||
# code is identical either way.
|
||||
export QEMU_STACK_SIZE=64M
|
||||
cmake -B build \
|
||||
-D CMAKE_INSTALL_PREFIX=/usr \
|
||||
-D CMAKE_BUILD_TYPE=Release
|
||||
cmake --build build
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "$_archive"
|
||||
DESTDIR="$pkgdir" cmake --install build
|
||||
install -Dm0644 -t "$pkgdir/usr/share/licenses/$pkgname" LICENSE
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"source": "local",
|
||||
"upstream": {
|
||||
"watch": {
|
||||
"pattern": "v(?P<version>[0-9]+(?:\\.[0-9]+)*)",
|
||||
"git_tags": "https://github.com/AsahiLinux/avd-fw.git"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
# Open replacement firmware for the Apple Video Decoder.
|
||||
# Built from AsahiLinux sources, without extracting proprietary firmware.
|
||||
|
||||
pkgname=avd-fw
|
||||
pkgver=0.1
|
||||
pkgrel=1
|
||||
pkgdesc='Open replacement firmware for the Apple Video Decoder (AVD) on Apple Silicon'
|
||||
# This recipe uses the native ARM linker and serves Apple Silicon systems.
|
||||
# Restrict both builds and publication to aarch64.
|
||||
arch=('aarch64')
|
||||
url='https://github.com/AsahiLinux/avd-fw'
|
||||
license=('MIT')
|
||||
# clang cross-compiles to arm-none-eabi out of the box, so no arm-none-eabi
|
||||
# toolchain is required; llvm supplies llvm-objcopy, which meson.build looks
|
||||
# up by name to turn each linked ELF into a padded raw image.
|
||||
makedepends=('meson' 'clang' 'llvm')
|
||||
# !buildflags is load-bearing: makepkg's CFLAGS/LDFLAGS target the aarch64 host
|
||||
# and would be injected into a bare-metal Cortex-M3 build. !strip keeps makepkg
|
||||
# from running the host strip over raw firmware images.
|
||||
options=('!strip' '!debug' '!buildflags' '!lto')
|
||||
source=("$pkgname-$pkgver.tar.gz::$url/archive/refs/tags/v$pkgver.tar.gz")
|
||||
sha256sums=('2e131244275cb15c94243e41eec8a2a665ec895cfe3a818181549db991e62c67')
|
||||
|
||||
build() {
|
||||
# The cross file selects clang, pins the host machine to cortex-m3 and sets
|
||||
# libdir=lib, which lands the images in /usr/lib/firmware/apple.
|
||||
#
|
||||
# Optimization is pinned to match upstream's Makefile (-O2). Meson's default
|
||||
# buildtype is "debug" (-O0 -g), which would ship unoptimized firmware; the
|
||||
# MMIO accessors in src/util.c go through a volatile typedef, so -O2 cannot
|
||||
# elide register reads or writes.
|
||||
meson setup \
|
||||
--cross-file "$pkgname-$pkgver/llvm.ini" \
|
||||
--prefix=/usr \
|
||||
-Doptimization=2 \
|
||||
-Ddebug=false \
|
||||
"$pkgname-$pkgver" build
|
||||
|
||||
meson compile -C build
|
||||
}
|
||||
|
||||
package() {
|
||||
meson install -C build --destdir "$pkgdir"
|
||||
|
||||
# meson installs custom_target outputs 0755; these are firmware blobs, not
|
||||
# programs, and every other firmware file on the system is 0644.
|
||||
chmod 644 "$pkgdir"/usr/lib/firmware/apple/*.bin
|
||||
|
||||
install -Dm644 "$pkgname-$pkgver/LICENSE" \
|
||||
"$pkgdir/usr/share/licenses/$pkgname/LICENSE"
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"source": "local",
|
||||
"release_ring": "fast",
|
||||
"upstream": {
|
||||
"watch": {
|
||||
"debian": "https://brave-browser-apt-release.s3.brave.com/dists/stable/main/binary-amd64/Packages",
|
||||
"package": "brave-browser",
|
||||
"pattern": "(?P<version>[0-9]+(?:\\.[0-9]+)*)"
|
||||
}
|
||||
},
|
||||
"origin": {
|
||||
"aur": "brave-bin",
|
||||
"commit": "d86e5479e163dac19d7ace3de472710e6eb06eea"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
# Maintainer: brave <aur-release@brave.com>
|
||||
# Contributor: Caleb Maclennan <caleb@alerque.com>
|
||||
# Contributor: José Miguel Sarasola <jmsaraur@gmail.com>
|
||||
# Contributor: Như Bảo Trương <28810481+nhubaotruong@users.noreply.github.com>
|
||||
# Contributor: Andrés Rodríguez <hello@andres.codes>
|
||||
# Contributor: Jacob Mischka <jacob@mischka.me>
|
||||
# Contributor: Manuel Mazzuola <origin.of@gmail.com>
|
||||
# Contributor: Simón Oroño <simonorono@protonmail.com>
|
||||
# Contributor: now-im <now im 627 @ gmail . com>
|
||||
# Contributor: Giusy Digital <kurmikon at libero dot it>
|
||||
|
||||
pkgname=brave-bin
|
||||
pkgver=1.96.59
|
||||
pkgrel=1
|
||||
epoch=1
|
||||
pkgdesc='Web browser that blocks ads and trackers by default (binary release)'
|
||||
arch=(x86_64 aarch64)
|
||||
url=https://brave.com
|
||||
license=(MPL2 BSD custom:chromium)
|
||||
depends=(alsa-lib
|
||||
gtk3
|
||||
libxss
|
||||
nss
|
||||
ttf-font)
|
||||
optdepends=('cups: Printer support'
|
||||
'libgnome-keyring: Enable GNOME keyring support'
|
||||
'libnotify: Native notification support')
|
||||
provides=("${pkgname%-bin}=$pkgver" 'brave-browser')
|
||||
conflicts=("${pkgname%-bin}")
|
||||
options=(!strip)
|
||||
source=($pkgname.sh brave-browser.desktop)
|
||||
source_x86_64=(${pkgname}-${pkgver}-x86_64.zip::https://github.com/brave/brave-browser/releases/download/v${pkgver}/brave-browser-${pkgver}-linux-amd64.zip)
|
||||
source_aarch64=(${pkgname}-${pkgver}-aarch64.zip::https://github.com/brave/brave-browser/releases/download/v${pkgver}/brave-browser-${pkgver}-linux-arm64.zip)
|
||||
|
||||
noextract=(${pkgname}-${pkgver}-x86_64.zip ${pkgname}-${pkgver}-aarch64.zip)
|
||||
sha256sums=('75a87dd17b42fcc6f27adfd16c82bed1c08e9251b07d2012f8d49f7412fa1d00'
|
||||
'c07276b69c7304981525ecb022f92daf7ae125a4fb05ac3442157b50826e257a')
|
||||
sha256sums_x86_64=('ee36d0fb939ebdf1922d47d7b4cb8879507733b2a76605a31bfe9dede3297139')
|
||||
sha256sums_aarch64=('faa8a26f1e7c0c3b8632633503f82e571a798212d8e6fe9baba77f0c73509867')
|
||||
|
||||
prepare() {
|
||||
mkdir -p brave
|
||||
bsdtar -xf "$pkgname-$pkgver-$CARCH.zip" -C brave
|
||||
chmod +x brave/brave
|
||||
}
|
||||
|
||||
package() {
|
||||
install -dm0755 "$pkgdir/opt"
|
||||
cp -a brave "$pkgdir/opt/$pkgname"
|
||||
|
||||
# allow firejail users to get the suid sandbox working
|
||||
chmod 4755 "$pkgdir/opt/brave-bin/chrome-sandbox"
|
||||
|
||||
install -Dm0755 "$pkgname.sh" "$pkgdir/usr/bin/brave"
|
||||
install -Dm0644 -t "$pkgdir/usr/share/applications/" "brave-browser.desktop"
|
||||
install -Dm0644 -t "$pkgdir/usr/share/licenses/$pkgname/" brave/LICENSE
|
||||
pushd "$pkgdir/usr/"
|
||||
for size in 16x16 24x24 32x32 48x48 64x64 128x128 256x256; do
|
||||
install -Dm0644 "$pkgdir/opt/$pkgname/product_logo_${size/x*/}.png" \
|
||||
"share/icons/hicolor/$size/apps/brave-desktop.png"
|
||||
done
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-"${HOME}/.config"}"
|
||||
|
||||
CONF_FILE="${XDG_CONFIG_HOME}/brave-flags.conf"
|
||||
|
||||
if
|
||||
test -f "${CONF_FILE}"
|
||||
then
|
||||
mapfile -t CONF_LIST < "${CONF_FILE}"
|
||||
fi
|
||||
|
||||
for CONF_LINE in "${CONF_LIST[@]}"
|
||||
do
|
||||
if ! [[
|
||||
"${CONF_LINE}" =~ ^[[:space:]]*(#|$)
|
||||
]]
|
||||
then
|
||||
FLAG_LIST+=("${CONF_LINE}")
|
||||
fi
|
||||
done
|
||||
|
||||
export CHROME_VERSION_EXTRA='stable'
|
||||
|
||||
exec /opt/brave-bin/brave "${FLAG_LIST[@]}" "${@}"
|
||||
@@ -0,0 +1,224 @@
|
||||
[Desktop Entry]
|
||||
Version=1.0
|
||||
Name=Brave
|
||||
# Only KDE 4 seems to use GenericName, so we reuse the KDE strings.
|
||||
# From Ubuntu's language-pack-kde-XX-base packages, version 9.04-20090413.
|
||||
GenericName=Web Browser
|
||||
GenericName[ar]=متصفح الشبكة
|
||||
GenericName[bg]=Уеб браузър
|
||||
GenericName[ca]=Navegador web
|
||||
GenericName[cs]=WWW prohlížeč
|
||||
GenericName[da]=Browser
|
||||
GenericName[de]=Web-Browser
|
||||
GenericName[el]=Περιηγητής ιστού
|
||||
GenericName[en_GB]=Web Browser
|
||||
GenericName[es]=Navegador web
|
||||
GenericName[et]=Veebibrauser
|
||||
GenericName[fi]=WWW-selain
|
||||
GenericName[fr]=Navigateur Web
|
||||
GenericName[gu]=વેબ બ્રાઉઝર
|
||||
GenericName[he]=דפדפן אינטרנט
|
||||
GenericName[hi]=वेब ब्राउज़र
|
||||
GenericName[hu]=Webböngésző
|
||||
GenericName[it]=Browser Web
|
||||
GenericName[ja]=ウェブブラウザ
|
||||
GenericName[kn]=ಜಾಲ ವೀಕ್ಷಕ
|
||||
GenericName[ko]=웹 브라우저
|
||||
GenericName[lt]=Žiniatinklio naršyklė
|
||||
GenericName[lv]=Tīmekļa pārlūks
|
||||
GenericName[ml]=വെബ് ബ്രൌസര്
|
||||
GenericName[mr]=वेब ब्राऊजर
|
||||
GenericName[nb]=Nettleser
|
||||
GenericName[nl]=Webbrowser
|
||||
GenericName[pl]=Przeglądarka WWW
|
||||
GenericName[pt]=Navegador Web
|
||||
GenericName[pt_BR]=Navegador da Internet
|
||||
GenericName[ro]=Navigator de Internet
|
||||
GenericName[ru]=Веб-браузер
|
||||
GenericName[sl]=Spletni brskalnik
|
||||
GenericName[sv]=Webbläsare
|
||||
GenericName[ta]=இணைய உலாவி
|
||||
GenericName[th]=เว็บเบราว์เซอร์
|
||||
GenericName[tr]=Web Tarayıcı
|
||||
GenericName[uk]=Навігатор Тенет
|
||||
GenericName[zh_CN]=网页浏览器
|
||||
GenericName[zh_HK]=網頁瀏覽器
|
||||
GenericName[zh_TW]=網頁瀏覽器
|
||||
# Not translated in KDE, from Epiphany 2.26.1-0ubuntu1.
|
||||
GenericName[bn]=ওয়েব ব্রাউজার
|
||||
GenericName[fil]=Web Browser
|
||||
GenericName[hr]=Web preglednik
|
||||
GenericName[id]=Browser Web
|
||||
GenericName[or]=ଓ୍ବେବ ବ୍ରାଉଜର
|
||||
GenericName[sk]=WWW prehliadač
|
||||
GenericName[sr]=Интернет прегледник
|
||||
GenericName[te]=మహాతల అన్వేషి
|
||||
GenericName[vi]=Bộ duyệt Web
|
||||
# Gnome and KDE 3 uses Comment.
|
||||
Comment=Access the Internet
|
||||
Comment[ar]=الدخول إلى الإنترنت
|
||||
Comment[bg]=Достъп до интернет
|
||||
Comment[bn]=ইন্টারনেটটি অ্যাক্সেস করুন
|
||||
Comment[ca]=Accedeix a Internet
|
||||
Comment[cs]=Přístup k internetu
|
||||
Comment[da]=Få adgang til internettet
|
||||
Comment[de]=Internetzugriff
|
||||
Comment[el]=Πρόσβαση στο Διαδίκτυο
|
||||
Comment[en_GB]=Access the Internet
|
||||
Comment[es]=Accede a Internet.
|
||||
Comment[et]=Pääs Internetti
|
||||
Comment[fi]=Käytä internetiä
|
||||
Comment[fil]=I-access ang Internet
|
||||
Comment[fr]=Accéder à Internet
|
||||
Comment[gu]=ઇંટરનેટ ઍક્સેસ કરો
|
||||
Comment[he]=גישה אל האינטרנט
|
||||
Comment[hi]=इंटरनेट तक पहुंच स्थापित करें
|
||||
Comment[hr]=Pristup Internetu
|
||||
Comment[hu]=Internetelérés
|
||||
Comment[id]=Akses Internet
|
||||
Comment[it]=Accesso a Internet
|
||||
Comment[ja]=インターネットにアクセス
|
||||
Comment[kn]=ಇಂಟರ್ನೆಟ್ ಅನ್ನು ಪ್ರವೇಶಿಸಿ
|
||||
Comment[ko]=인터넷 연결
|
||||
Comment[lt]=Interneto prieiga
|
||||
Comment[lv]=Piekļūt internetam
|
||||
Comment[ml]=ഇന്റര്നെറ്റ് ആക്സസ് ചെയ്യുക
|
||||
Comment[mr]=इंटरनेटमध्ये प्रवेश करा
|
||||
Comment[nb]=Gå til Internett
|
||||
Comment[nl]=Verbinding maken met internet
|
||||
Comment[or]=ଇଣ୍ଟର୍ନେଟ୍ ପ୍ରବେଶ କରନ୍ତୁ
|
||||
Comment[pl]=Skorzystaj z internetu
|
||||
Comment[pt]=Aceder à Internet
|
||||
Comment[pt_BR]=Acessar a internet
|
||||
Comment[ro]=Accesaţi Internetul
|
||||
Comment[ru]=Доступ в Интернет
|
||||
Comment[sk]=Prístup do siete Internet
|
||||
Comment[sl]=Dostop do interneta
|
||||
Comment[sr]=Приступите Интернету
|
||||
Comment[sv]=Gå ut på Internet
|
||||
Comment[ta]=இணையத்தை அணுகுதல்
|
||||
Comment[te]=ఇంటర్నెట్ను ఆక్సెస్ చెయ్యండి
|
||||
Comment[th]=เข้าถึงอินเทอร์เน็ต
|
||||
Comment[tr]=İnternet'e erişin
|
||||
Comment[uk]=Доступ до Інтернету
|
||||
Comment[vi]=Truy cập Internet
|
||||
Comment[zh_CN]=访问互联网
|
||||
Comment[zh_HK]=連線到網際網路
|
||||
Comment[zh_TW]=連線到網際網路
|
||||
StartupNotify=true
|
||||
StartupWMClass=brave-browser
|
||||
TryExec=brave
|
||||
Exec=brave %U
|
||||
Terminal=false
|
||||
Icon=brave-desktop
|
||||
Type=Application
|
||||
Categories=Network;WebBrowser;
|
||||
MimeType=application/pdf;application/rdf+xml;application/rss+xml;application/xhtml+xml;application/xhtml_xml;application/xml;image/gif;image/jpeg;image/png;image/webp;text/html;text/xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ipfs;x-scheme-handler/ipns;
|
||||
Actions=new-window;new-private-window;
|
||||
|
||||
[Desktop Action new-window]
|
||||
Name=New Window
|
||||
Name[am]=አዲስ መስኮት
|
||||
Name[ar]=نافذة جديدة
|
||||
Name[bg]=Нов прозорец
|
||||
Name[bn]=নতুন উইন্ডো
|
||||
Name[ca]=Finestra nova
|
||||
Name[cs]=Nové okno
|
||||
Name[da]=Nyt vindue
|
||||
Name[de]=Neues Fenster
|
||||
Name[el]=Νέο Παράθυρο
|
||||
Name[en_GB]=New Window
|
||||
Name[es]=Nueva ventana
|
||||
Name[et]=Uus aken
|
||||
Name[fa]=پنجره جدید
|
||||
Name[fi]=Uusi ikkuna
|
||||
Name[fil]=New Window
|
||||
Name[fr]=Nouvelle fenêtre
|
||||
Name[gu]=નવી વિંડો
|
||||
Name[hi]=नई विंडो
|
||||
Name[hr]=Novi prozor
|
||||
Name[hu]=Új ablak
|
||||
Name[id]=Jendela Baru
|
||||
Name[it]=Nuova finestra
|
||||
Name[iw]=חלון חדש
|
||||
Name[ja]=新規ウインドウ
|
||||
Name[kn]=ಹೊಸ ವಿಂಡೊ
|
||||
Name[ko]=새 창
|
||||
Name[lt]=Naujas langas
|
||||
Name[lv]=Jauns logs
|
||||
Name[ml]=പുതിയ വിന്ഡോ
|
||||
Name[mr]=नवीन विंडो
|
||||
Name[nl]=Nieuw venster
|
||||
Name[no]=Nytt vindu
|
||||
Name[pl]=Nowe okno
|
||||
Name[pt]=Nova janela
|
||||
Name[pt_BR]=Nova janela
|
||||
Name[ro]=Fereastră nouă
|
||||
Name[ru]=Новое окно
|
||||
Name[sk]=Nové okno
|
||||
Name[sl]=Novo okno
|
||||
Name[sr]=Нови прозор
|
||||
Name[sv]=Nytt fönster
|
||||
Name[sw]=Dirisha Jipya
|
||||
Name[ta]=புதிய சாளரம்
|
||||
Name[te]=క్రొత్త విండో
|
||||
Name[th]=หน้าต่างใหม่
|
||||
Name[tr]=Yeni Pencere
|
||||
Name[uk]=Нове вікно
|
||||
Name[vi]=Cửa sổ Mới
|
||||
Name[zh_CN]=新建窗口
|
||||
Name[zh_TW]=開新視窗
|
||||
Exec=brave
|
||||
|
||||
[Desktop Action new-private-window]
|
||||
Name=New Incognito Window
|
||||
Name[ar]=نافذة جديدة للتصفح المتخفي
|
||||
Name[bg]=Нов прозорец „инкогнито“
|
||||
Name[bn]=নতুন ছদ্মবেশী উইন্ডো
|
||||
Name[ca]=Finestra d'incògnit nova
|
||||
Name[cs]=Nové anonymní okno
|
||||
Name[da]=Nyt inkognitovindue
|
||||
Name[de]=Neues Inkognito-Fenster
|
||||
Name[el]=Νέο παράθυρο για ανώνυμη περιήγηση
|
||||
Name[en_GB]=New Incognito window
|
||||
Name[es]=Nueva ventana de incógnito
|
||||
Name[et]=Uus inkognito aken
|
||||
Name[fa]=پنجره جدید حالت ناشناس
|
||||
Name[fi]=Uusi incognito-ikkuna
|
||||
Name[fil]=Bagong Incognito window
|
||||
Name[fr]=Nouvelle fenêtre de navigation privée
|
||||
Name[gu]=નવી છુપી વિંડો
|
||||
Name[hi]=नई गुप्त विंडो
|
||||
Name[hr]=Novi anoniman prozor
|
||||
Name[hu]=Új Inkognitóablak
|
||||
Name[id]=Jendela Penyamaran baru
|
||||
Name[it]=Nuova finestra di navigazione in incognito
|
||||
Name[iw]=חלון חדש לגלישה בסתר
|
||||
Name[ja]=新しいシークレット ウィンドウ
|
||||
Name[kn]=ಹೊಸ ಅಜ್ಞಾತ ವಿಂಡೋ
|
||||
Name[ko]=새 시크릿 창
|
||||
Name[lt]=Naujas inkognito langas
|
||||
Name[lv]=Jauns inkognito režīma logs
|
||||
Name[ml]=പുതിയ വേഷ പ്രച്ഛന്ന വിന്ഡോ
|
||||
Name[mr]=नवीन गुप्त विंडो
|
||||
Name[nl]=Nieuw incognitovenster
|
||||
Name[no]=Nytt inkognitovindu
|
||||
Name[pl]=Nowe okno incognito
|
||||
Name[pt]=Nova janela de navegação anónima
|
||||
Name[pt_BR]=Nova janela anônima
|
||||
Name[ro]=Fereastră nouă incognito
|
||||
Name[ru]=Новое окно в режиме инкогнито
|
||||
Name[sk]=Nové okno inkognito
|
||||
Name[sl]=Novo okno brez beleženja zgodovine
|
||||
Name[sr]=Нови прозор за прегледање без архивирања
|
||||
Name[sv]=Nytt inkognitofönster
|
||||
Name[ta]=புதிய மறைநிலைச் சாளரம்
|
||||
Name[te]=క్రొత్త అజ్ఞాత విండో
|
||||
Name[th]=หน้าต่างใหม่ที่ไม่ระบุตัวตน
|
||||
Name[tr]=Yeni Gizli pencere
|
||||
Name[uk]=Нове вікно в режимі анонімного перегляду
|
||||
Name[vi]=Cửa sổ ẩn danh mới
|
||||
Name[zh_CN]=新建隐身窗口
|
||||
Name[zh_TW]=新增無痕式視窗
|
||||
Exec=brave --incognito
|
||||
MimeType=x-scheme-handler/unknown;x-scheme-handler/about;text/html;text/xml;application/xhtml_xml;image/webp;x-scheme-handler/http;x-scheme-handler/https;
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"source": "local",
|
||||
"release_ring": "fast",
|
||||
"upstream": {
|
||||
"watch": {
|
||||
"debian": "https://brave-browser-apt-release.s3.brave.com/dists/stable/main/binary-amd64/Packages",
|
||||
"package": "brave-origin",
|
||||
"pattern": "(?P<version>[0-9]+(?:\\.[0-9]+)*)"
|
||||
}
|
||||
},
|
||||
"origin": {
|
||||
"aur": "brave-origin-bin",
|
||||
"commit": "f2daecf7b7576cd445094ed09c3c783619ca0eb2"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
# Maintainer: brave <aur-release@brave.com>
|
||||
|
||||
pkgname=brave-origin-bin
|
||||
pkgver=1.96.59
|
||||
pkgrel=1
|
||||
epoch=1
|
||||
pkgdesc='The minimalist browser from the makers of Brave (binary release).'
|
||||
arch=(x86_64 aarch64)
|
||||
url=https://brave.com/origin/download
|
||||
license=('MPL2')
|
||||
depends=(alsa-lib gtk3 libxss nss ttf-font)
|
||||
optdepends=('cups: Printer support'
|
||||
'libgnome-keyring: Enable GNOME keyring support'
|
||||
'libnotify: Native notification support')
|
||||
provides=("$pkgname" "${pkgname%-bin}")
|
||||
conflicts=("${pkgname%-bin}")
|
||||
options=(!strip)
|
||||
source=($pkgname.sh "${pkgname%-bin}.desktop")
|
||||
source_x86_64=("${pkgname}-${pkgver}-x86_64.zip::https://github.com/brave/brave-browser/releases/download/v${pkgver}/brave-origin-${pkgver}-linux-amd64.zip")
|
||||
source_aarch64=("${pkgname}-${pkgver}-aarch64.zip::https://github.com/brave/brave-browser/releases/download/v${pkgver}/brave-origin-${pkgver}-linux-arm64.zip")
|
||||
|
||||
noextract=("${pkgname}-${pkgver}-x86_64.zip" "${pkgname}-${pkgver}-aarch64.zip")
|
||||
sha256sums=('5ff70ee473f35c2fc7642c422c8abe20aaac0d7cc30a3292744eb9fbeafba1bd'
|
||||
'c70bc71c696b6764247070375ae111bd76c8bad9c7bda4d46e03975b95571a8a')
|
||||
sha256sums_x86_64=('ad71abea5326d15bbe813a1e9592bcf2383f2ecc083a432313ca80b4436d3797')
|
||||
sha256sums_aarch64=('68d1fb922e0ad25099081a32a7f0611f2657345726590b697eaf6bbb820848ee')
|
||||
|
||||
prepare() {
|
||||
mkdir -p brave
|
||||
bsdtar -xf "$pkgname-$pkgver-$CARCH.zip" -C brave
|
||||
chmod +x brave/brave
|
||||
}
|
||||
|
||||
package() {
|
||||
install -dm0755 "$pkgdir/opt"
|
||||
cp -a brave "$pkgdir/opt/$pkgname"
|
||||
chmod 4755 "$pkgdir/opt/$pkgname/chrome-sandbox"
|
||||
install -Dm0755 "$pkgname.sh" "$pkgdir/usr/bin/${pkgname%-bin}"
|
||||
install -Dm0644 -t "$pkgdir/usr/share/applications/" "${pkgname%-bin}.desktop"
|
||||
install -Dm0644 -t "$pkgdir/usr/share/licenses/$pkgname/" brave/LICENSE
|
||||
pushd "$pkgdir/usr/"
|
||||
for size in 16x16 24x24 32x32 48x48 64x64 128x128 256x256; do
|
||||
install -Dm0644 "$pkgdir/opt/$pkgname/product_logo_${size/x*/}.png" \
|
||||
"share/icons/hicolor/$size/apps/brave-origin.png"
|
||||
done
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-"${HOME}/.config"}"
|
||||
|
||||
CONF_FILE="${XDG_CONFIG_HOME}/brave-origin-flags.conf"
|
||||
|
||||
if
|
||||
test -f "${CONF_FILE}"
|
||||
then
|
||||
mapfile -t CONF_LIST < "${CONF_FILE}"
|
||||
fi
|
||||
|
||||
for CONF_LINE in "${CONF_LIST[@]}"
|
||||
do
|
||||
if ! [[
|
||||
"${CONF_LINE}" =~ ^[[:space:]]*(#|$)
|
||||
]]
|
||||
then
|
||||
FLAG_LIST+=("${CONF_LINE}")
|
||||
fi
|
||||
done
|
||||
|
||||
export CHROME_VERSION_EXTRA='stable'
|
||||
|
||||
exec /opt/brave-origin-bin/brave-origin "${FLAG_LIST[@]}" "${@}"
|
||||
@@ -0,0 +1,222 @@
|
||||
[Desktop Entry]
|
||||
Version=1.0
|
||||
Name=Brave Origin
|
||||
# Only KDE 4 seems to use GenericName, so we reuse the KDE strings.
|
||||
# From Ubuntu's language-pack-kde-XX-base packages, version 9.04-20090413.
|
||||
GenericName=Web Browser
|
||||
GenericName[ar]=متصفح الشبكة
|
||||
GenericName[bg]=Уеб браузър
|
||||
GenericName[ca]=Navegador web
|
||||
GenericName[cs]=WWW prohlížeč
|
||||
GenericName[da]=Browser
|
||||
GenericName[de]=Web-Browser
|
||||
GenericName[el]=Περιηγητής ιστού
|
||||
GenericName[en_GB]=Web Browser
|
||||
GenericName[es]=Navegador web
|
||||
GenericName[et]=Veebibrauser
|
||||
GenericName[fi]=WWW-selain
|
||||
GenericName[fr]=Navigateur Web
|
||||
GenericName[gu]=વેબ બ્રાઉઝર
|
||||
GenericName[he]=דפדפן אינטרנט
|
||||
GenericName[hi]=वेब ब्राउज़र
|
||||
GenericName[hu]=Webböngésző
|
||||
GenericName[it]=Browser Web
|
||||
GenericName[ja]=ウェブブラウザ
|
||||
GenericName[kn]=ಜಾಲ ವೀಕ್ಷಕ
|
||||
GenericName[ko]=웹 브라우저
|
||||
GenericName[lt]=Žiniatinklio naršyklė
|
||||
GenericName[lv]=Tīmekļa pārlūks
|
||||
GenericName[ml]=വെബ് ബ്രൌസര്
|
||||
GenericName[mr]=वेब ब्राऊजर
|
||||
GenericName[nb]=Nettleser
|
||||
GenericName[nl]=Webbrowser
|
||||
GenericName[pl]=Przeglądarka WWW
|
||||
GenericName[pt]=Navegador Web
|
||||
GenericName[pt_BR]=Navegador da Internet
|
||||
GenericName[ro]=Navigator de Internet
|
||||
GenericName[ru]=Веб-браузер
|
||||
GenericName[sl]=Spletni brskalnik
|
||||
GenericName[sv]=Webbläsare
|
||||
GenericName[ta]=இணைய உலாவி
|
||||
GenericName[th]=เว็บเบราว์เซอร์
|
||||
GenericName[tr]=Web Tarayıcı
|
||||
GenericName[uk]=Навігатор Тенет
|
||||
GenericName[zh_CN]=网页浏览器
|
||||
GenericName[zh_HK]=網頁瀏覽器
|
||||
GenericName[zh_TW]=網頁瀏覽器
|
||||
# Not translated in KDE, from Epiphany 2.26.1-0ubuntu1.
|
||||
GenericName[bn]=ওয়েব ব্রাউজার
|
||||
GenericName[fil]=Web Browser
|
||||
GenericName[hr]=Web preglednik
|
||||
GenericName[id]=Browser Web
|
||||
GenericName[or]=ଓ୍ବେବ ବ୍ରାଉଜର
|
||||
GenericName[sk]=WWW prehliadač
|
||||
GenericName[sr]=Интернет прегледник
|
||||
GenericName[te]=మహాతల అన్వేషి
|
||||
GenericName[vi]=Bộ duyệt Web
|
||||
# Gnome and KDE 3 uses Comment.
|
||||
Comment=Access the Internet
|
||||
Comment[ar]=الدخول إلى الإنترنت
|
||||
Comment[bg]=Достъп до интернет
|
||||
Comment[bn]=ইন্টারনেটটি অ্যাক্সেস করুন
|
||||
Comment[ca]=Accedeix a Internet
|
||||
Comment[cs]=Přístup k internetu
|
||||
Comment[da]=Få adgang til internettet
|
||||
Comment[de]=Internetzugriff
|
||||
Comment[el]=Πρόσβαση στο Διαδίκτυο
|
||||
Comment[en_GB]=Access the Internet
|
||||
Comment[es]=Accede a Internet.
|
||||
Comment[et]=Pääs Internetti
|
||||
Comment[fi]=Käytä internetiä
|
||||
Comment[fil]=I-access ang Internet
|
||||
Comment[fr]=Accéder à Internet
|
||||
Comment[gu]=ઇંટરનેટ ઍક્સેસ કરો
|
||||
Comment[he]=גישה אל האינטרנט
|
||||
Comment[hi]=इंटरनेट तक पहुंच स्थापित करें
|
||||
Comment[hr]=Pristup Internetu
|
||||
Comment[hu]=Internetelérés
|
||||
Comment[id]=Akses Internet
|
||||
Comment[it]=Accesso a Internet
|
||||
Comment[ja]=インターネットにアクセス
|
||||
Comment[kn]=ಇಂಟರ್ನೆಟ್ ಅನ್ನು ಪ್ರವೇಶಿಸಿ
|
||||
Comment[ko]=인터넷 연결
|
||||
Comment[lt]=Interneto prieiga
|
||||
Comment[lv]=Piekļūt internetam
|
||||
Comment[ml]=ഇന്റര്നെറ്റ് ആക്സസ് ചെയ്യുക
|
||||
Comment[mr]=इंटरनेटमध्ये प्रवेश करा
|
||||
Comment[nb]=Gå til Internett
|
||||
Comment[nl]=Verbinding maken met internet
|
||||
Comment[or]=ଇଣ୍ଟର୍ନେଟ୍ ପ୍ରବେଶ କରନ୍ତୁ
|
||||
Comment[pl]=Skorzystaj z internetu
|
||||
Comment[pt]=Aceder à Internet
|
||||
Comment[pt_BR]=Acessar a internet
|
||||
Comment[ro]=Accesaţi Internetul
|
||||
Comment[ru]=Доступ в Интернет
|
||||
Comment[sk]=Prístup do siete Internet
|
||||
Comment[sl]=Dostop do interneta
|
||||
Comment[sr]=Приступите Интернету
|
||||
Comment[sv]=Gå ut på Internet
|
||||
Comment[ta]=இணையத்தை அணுகுதல்
|
||||
Comment[te]=ఇంటర్నెట్ను ఆక్సెస్ చెయ్యండి
|
||||
Comment[th]=เข้าถึงอินเทอร์เน็ต
|
||||
Comment[tr]=İnternet'e erişin
|
||||
Comment[uk]=Доступ до Інтернету
|
||||
Comment[vi]=Truy cập Internet
|
||||
Comment[zh_CN]=访问互联网
|
||||
Comment[zh_HK]=連線到網際網路
|
||||
Comment[zh_TW]=連線到網際網路
|
||||
StartupNotify=true
|
||||
StartupWMClass=brave-origin
|
||||
Exec=brave-origin %U
|
||||
Terminal=false
|
||||
Icon=brave-origin
|
||||
Type=Application
|
||||
Categories=Network;WebBrowser;
|
||||
MimeType=application/pdf;application/rdf+xml;application/rss+xml;application/xhtml+xml;application/xhtml_xml;application/xml;image/gif;image/jpeg;image/png;image/webp;text/html;text/xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/chromium;
|
||||
Actions=new-window;new-private-window;
|
||||
|
||||
[Desktop Action new-window]
|
||||
Name=New Window
|
||||
Name[am]=አዲስ መስኮት
|
||||
Name[ar]=نافذة جديدة
|
||||
Name[bg]=Нов прозорец
|
||||
Name[bn]=নতুন উইন্ডো
|
||||
Name[ca]=Finestra nova
|
||||
Name[cs]=Nové okno
|
||||
Name[da]=Nyt vindue
|
||||
Name[de]=Neues Fenster
|
||||
Name[el]=Νέο Παράθυρο
|
||||
Name[en_GB]=New Window
|
||||
Name[es]=Nueva ventana
|
||||
Name[et]=Uus aken
|
||||
Name[fa]=پنجره جدید
|
||||
Name[fi]=Uusi ikkuna
|
||||
Name[fil]=New Window
|
||||
Name[fr]=Nouvelle fenêtre
|
||||
Name[gu]=નવી વિંડો
|
||||
Name[hi]=नई विंडो
|
||||
Name[hr]=Novi prozor
|
||||
Name[hu]=Új ablak
|
||||
Name[id]=Jendela Baru
|
||||
Name[it]=Nuova finestra
|
||||
Name[iw]=חלון חדש
|
||||
Name[ja]=新規ウインドウ
|
||||
Name[kn]=ಹೊಸ ವಿಂಡೊ
|
||||
Name[ko]=새 창
|
||||
Name[lt]=Naujas langas
|
||||
Name[lv]=Jauns logs
|
||||
Name[ml]=പുതിയ വിന്ഡോ
|
||||
Name[mr]=नवीन विंडो
|
||||
Name[nl]=Nieuw venster
|
||||
Name[no]=Nytt vindu
|
||||
Name[pl]=Nowe okno
|
||||
Name[pt]=Nova janela
|
||||
Name[pt_BR]=Nova janela
|
||||
Name[ro]=Fereastră nouă
|
||||
Name[ru]=Новое окно
|
||||
Name[sk]=Nové okno
|
||||
Name[sl]=Novo okno
|
||||
Name[sr]=Нови прозор
|
||||
Name[sv]=Nytt fönster
|
||||
Name[sw]=Dirisha Jipya
|
||||
Name[ta]=புதிய சாளரம்
|
||||
Name[te]=క్రొత్త విండో
|
||||
Name[th]=หน้าต่างใหม่
|
||||
Name[tr]=Yeni Pencere
|
||||
Name[uk]=Нове вікно
|
||||
Name[vi]=Cửa sổ Mới
|
||||
Name[zh_CN]=新建窗口
|
||||
Name[zh_TW]=開新視窗
|
||||
Exec=brave-origin
|
||||
|
||||
[Desktop Action new-private-window]
|
||||
Name=New Incognito Window
|
||||
Name[ar]=نافذة جديدة للتصفح المتخفي
|
||||
Name[bg]=Нов прозорец „инкогнито“
|
||||
Name[bn]=নতুন ছদ্মবেশী উইন্ডো
|
||||
Name[ca]=Finestra d'incògnit nova
|
||||
Name[cs]=Nové anonymní okno
|
||||
Name[da]=Nyt inkognitovindue
|
||||
Name[de]=Neues Inkognito-Fenster
|
||||
Name[el]=Νέο παράθυρο για ανώνυμη περιήγηση
|
||||
Name[en_GB]=New Incognito window
|
||||
Name[es]=Nueva ventana de incógnito
|
||||
Name[et]=Uus inkognito aken
|
||||
Name[fa]=پنجره جدید حالت ناشناس
|
||||
Name[fi]=Uusi incognito-ikkuna
|
||||
Name[fil]=Bagong Incognito window
|
||||
Name[fr]=Nouvelle fenêtre de navigation privée
|
||||
Name[gu]=નવી છુપી વિંડો
|
||||
Name[hi]=नई गुप्त विंडो
|
||||
Name[hr]=Novi anoniman prozor
|
||||
Name[hu]=Új Inkognitóablak
|
||||
Name[id]=Jendela Penyamaran baru
|
||||
Name[it]=Nuova finestra di navigazione in incognito
|
||||
Name[iw]=חלון חדש לגלישה בסתר
|
||||
Name[ja]=新しいシークレット ウィンドウ
|
||||
Name[kn]=ಹೊಸ ಅಜ್ಞಾತ ವಿಂಡೋ
|
||||
Name[ko]=새 시크릿 창
|
||||
Name[lt]=Naujas inkognito langas
|
||||
Name[lv]=Jauns inkognito režīma logs
|
||||
Name[ml]=പുതിയ വേഷ പ്രച്ഛന്ന വിന്ഡോ
|
||||
Name[mr]=नवीन गुप्त विंडो
|
||||
Name[nl]=Nieuw incognitovenster
|
||||
Name[no]=Nytt inkognitovindu
|
||||
Name[pl]=Nowe okno incognito
|
||||
Name[pt]=Nova janela de navegação anónima
|
||||
Name[pt_BR]=Nova janela anônima
|
||||
Name[ro]=Fereastră nouă incognito
|
||||
Name[ru]=Новое окно в режиме инкогнито
|
||||
Name[sk]=Nové okno inkognito
|
||||
Name[sl]=Novo okno brez beleženja zgodovine
|
||||
Name[sr]=Нови прозор за прегледање без архивирања
|
||||
Name[sv]=Nytt inkognitofönster
|
||||
Name[ta]=புதிய மறைநிலைச் சாளரம்
|
||||
Name[te]=క్రొత్త అజ్ఞాత విండో
|
||||
Name[th]=หน้าต่างใหม่ที่ไม่ระบุตัวตน
|
||||
Name[tr]=Yeni Gizli pencere
|
||||
Name[uk]=Нове вікно в режимі анонімного перегляду
|
||||
Name[vi]=Cửa sổ ẩn danh mới
|
||||
Name[zh_CN]=新建隐身窗口
|
||||
Name[zh_TW]=新增無痕式視窗
|
||||
Exec=brave-origin --incognito
|
||||
@@ -4,7 +4,7 @@
|
||||
# Automation repository: https://github.com/fabifont/claude-code-aur
|
||||
|
||||
pkgname=claude-code
|
||||
pkgver=2.1.278
|
||||
pkgver=2.1.283
|
||||
pkgrel=1
|
||||
pkgdesc="An agentic coding tool that lives in your terminal"
|
||||
arch=('x86_64' 'aarch64')
|
||||
@@ -29,8 +29,8 @@ source_x86_64=("claude-${pkgver}-x86_64::https://downloads.claude.ai/claude-code
|
||||
source_aarch64=("claude-${pkgver}-aarch64::https://downloads.claude.ai/claude-code-releases/${pkgver}/linux-arm64/claude")
|
||||
|
||||
sha256sums=('SKIP')
|
||||
sha256sums_x86_64=('5c4735937844e84f8a93306e841a5b0e12252909b07870f789b190468da147ab')
|
||||
sha256sums_aarch64=('7de6cab134e48321148e30182c98614118e8f4666819412bead45865190b34ed')
|
||||
sha256sums_x86_64=('1859583ce32920595c61ef868bee52e1b1594f7486db209935e01f1e5e804ae2')
|
||||
sha256sums_aarch64=('346d294f0103d6fc0de11ac953579b5c62dfa90698a4cfc486b6f927c615e697')
|
||||
|
||||
package() {
|
||||
install -Dm755 "${srcdir}/claude-${pkgver}-${CARCH}" "${pkgdir}/opt/claude-code/bin/claude"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
# repository's package index.
|
||||
|
||||
pkgname=claude-desktop
|
||||
pkgver=2.2553.1
|
||||
pkgver=2.7032.0
|
||||
pkgrel=1
|
||||
pkgdesc="Official Claude desktop app with Claude Code"
|
||||
arch=('x86_64' 'aarch64')
|
||||
@@ -63,8 +63,8 @@ source_x86_64=("${_deb_x86_64}::${_pool}/${_deb_x86_64}")
|
||||
source_aarch64=("${_deb_aarch64}::${_pool}/${_deb_aarch64}")
|
||||
noextract=("${_deb_x86_64}" "${_deb_aarch64}")
|
||||
sha256sums=('edfdbc63b65891ef7c481b07086c7e630fc102c042b6ed65331a52fcaf72b14a')
|
||||
sha256sums_x86_64=('6700fdd84e77a6b8c93912c2f69eb5d1e40fa99bcd9d37f438f809ef2a6fe6f8')
|
||||
sha256sums_aarch64=('0003a6f9605a210f03c38670d62cd59c71153c2702aa4427e4cabe2e2e5f3390')
|
||||
sha256sums_x86_64=('1e7f4504bca5b2f6b2d3c4123d145d727647e77f2ee2d046850711e61e7d7b11')
|
||||
sha256sums_aarch64=('6dca79fa4c8b65267780b5460c627159852e2dfa2ad011d03a0488f7bf226ec3')
|
||||
|
||||
package() {
|
||||
cd "${srcdir}"
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
# Maintainer: caarlos0 <carlos@charm.sh>
|
||||
|
||||
pkgname='crush-bin'
|
||||
pkgver=0.96.0
|
||||
pkgver=0.96.1
|
||||
pkgrel=1
|
||||
pkgdesc='A powerful terminal-based AI assistant for developers, providing intelligent coding assistance directly in your terminal.'
|
||||
url='https://charm.sh/crush'
|
||||
@@ -13,16 +13,16 @@ provides=('crush')
|
||||
conflicts=('crush')
|
||||
|
||||
source_aarch64=("${pkgname}_${pkgver}_aarch64.tar.gz::https://github.com/charmbracelet/crush/releases/download/v${pkgver}/crush_${pkgver}_Linux_arm64.tar.gz")
|
||||
sha256sums_aarch64=('667062a39d499506b0fe151148f8d7a1c5cb5722902080d44bb3dd2ddafbf5c1')
|
||||
sha256sums_aarch64=('4bfe4a37aedeb4219d51eb7a25b837304084070378e77fd578999764b487f01f')
|
||||
|
||||
source_armv7h=("${pkgname}_${pkgver}_armv7h.tar.gz::https://github.com/charmbracelet/crush/releases/download/v${pkgver}/crush_${pkgver}_Linux_armv7.tar.gz")
|
||||
sha256sums_armv7h=('1de4c1ccb237743e4debb8c302df612fcef5c9b3b5378f5b65c8c6f8bc15cbfa')
|
||||
sha256sums_armv7h=('e2926383bdf97ab97e52e214fe810570abcff39d00cfe72eaf07eca958f1214c')
|
||||
|
||||
source_i686=("${pkgname}_${pkgver}_i686.tar.gz::https://github.com/charmbracelet/crush/releases/download/v${pkgver}/crush_${pkgver}_Linux_i386.tar.gz")
|
||||
sha256sums_i686=('4ec66431565de5721afb7afdd99e45ff6bc9c7e667bd18d9696ea7c5622e158d')
|
||||
sha256sums_i686=('bff753c454b1e9f18d5c3ab4f4395e3e6a505d1a4c033d50653e004647c166c2')
|
||||
|
||||
source_x86_64=("${pkgname}_${pkgver}_x86_64.tar.gz::https://github.com/charmbracelet/crush/releases/download/v${pkgver}/crush_${pkgver}_Linux_x86_64.tar.gz")
|
||||
sha256sums_x86_64=('5b33303a404acacf761c027e9fa9e69d4d2dd050c2690abe40877c49574b7475')
|
||||
sha256sums_x86_64=('5411b0906a82162dcab4a99071d70accf1caad0eee69789416dd607943c6680d')
|
||||
|
||||
package() {
|
||||
case "$CARCH" in
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
# binary to point at pm.sh, a stand-in that declines and names pacman instead.
|
||||
|
||||
pkgname=cua-driver-bin
|
||||
pkgver=0.28.2
|
||||
pkgver=0.29.1
|
||||
pkgrel=1
|
||||
pkgdesc="Computer-use driver for native GUI apps: accessibility-tree snapshots and input injection"
|
||||
arch=('x86_64' 'aarch64')
|
||||
@@ -46,8 +46,8 @@ source_x86_64=("https://github.com/trycua/cua/releases/download/cua-driver-rs-v$
|
||||
source_aarch64=("https://github.com/trycua/cua/releases/download/cua-driver-rs-v${pkgver}/cua-driver-rs-${pkgver}-linux-arm64.tar.gz")
|
||||
sha256sums=('c0779290c1d4783169aa3dbfb55feb505e563ef8a004bbf55298ceffcfbda8d9'
|
||||
'c76e251c3ed424200eac52bec35ba534336307fabd83a175ab0b47e2084ab0d8')
|
||||
sha256sums_x86_64=('8f3e5b669e2bcd98d0eecc64f40640aac77f358b6332a06abc6ee79991620f7d')
|
||||
sha256sums_aarch64=('cadd7e6b757c3ce50f2b5f6e273c154ea48450fb5fcaff744209b382915eddf5')
|
||||
sha256sums_x86_64=('61a0c0f24d6b03e31bb7a73390db875ecf0de2ce53aa435eadb03d70979d79a5')
|
||||
sha256sums_aarch64=('47c1efa081057c9c1a18e45b20cb7dd0d7d2313520d18ba7d0d35f271005fe19')
|
||||
|
||||
case "${CARCH}" in
|
||||
x86_64) _platform="linux-x86_64" ;;
|
||||
|
||||
@@ -1,33 +1,53 @@
|
||||
# Maintainer: Gunther Schulz <dev@guntherschulz.de>
|
||||
|
||||
pkgname=cursor-bin
|
||||
pkgver=3.21.16
|
||||
pkgrel=2
|
||||
pkgver=3.22.7
|
||||
pkgrel=1
|
||||
pkgdesc='AI-first coding environment'
|
||||
arch=('x86_64')
|
||||
arch=('x86_64' 'aarch64')
|
||||
url="https://www.cursor.com"
|
||||
license=('LicenseRef-Cursor_EULA')
|
||||
# upstream uses Electron newer than internal VSCode
|
||||
_electron=electron42
|
||||
depends=(xdg-utils ripgrep $_electron nodejs
|
||||
'gcc-libs' 'hicolor-icon-theme' 'libxkbfile')
|
||||
depends=(xdg-utils gcc-libs hicolor-icon-theme libxkbfile)
|
||||
depends_x86_64=(ripgrep $_electron nodejs)
|
||||
# ARM retains bundled Electron because electron42 is unavailable in ALARM.
|
||||
depends_aarch64=(
|
||||
alsa-lib at-spi2-core ca-certificates cairo curl dbus expat glib2 glibc gtk3
|
||||
libcups libsecret libx11 libxcb libxcomposite libxdamage libxext libxfixes
|
||||
libxkbcommon libxrandr mesa nspr nss pango systemd-libs which
|
||||
)
|
||||
options=(!strip !debug) # Don't break ext of VSCode
|
||||
_commit=8ae78e8eee1e63479c7e0504b664bc0a80c6800f
|
||||
source=("https://downloads.cursor.com/production/${_commit}/linux/x64/deb/amd64/deb/cursor_${pkgver}_amd64.deb"
|
||||
_commit=37076c6c3f9e253c0fa2305197e45befd13a2268
|
||||
source_x86_64=("https://downloads.cursor.com/production/${_commit}/linux/x64/deb/amd64/deb/cursor_${pkgver}_amd64.deb"
|
||||
"https://gitlab.archlinux.org/archlinux/packaging/packages/code/-/raw/main/code."{sh,mjs}
|
||||
rg.sh)
|
||||
sha512sums=('032c86a5d51f154ce36b1a0bf34aa06b2d117666b4372a787ea3117fc0b2b1686e952c721388f2eaf7787f2e0581378c98608048126f7470df2e85e9dbd75ca4' '937299c6cb6be2f8d25f7dbc95cf77423875c5f8353b8bd6cd7cc8e5603cbf8405b14dbf8bd615db2e3b36ed680fc8e1909410815f7f8587b7267a699e00ab37' '793f9ff6306e3992ac89802d98110cba288ea1181a901467333293b7d76182ef9792c2a39ff49d9347a18a174b1f42bc58862091dff583f4146c2704eea28033' 'e79fe7659f59d1ae02fc68816399bfd31587315df6cdb6ccf1d0ca76f7cdc692c2a42b30591c0091147bd97ef14b1c7745dc26bd7cb3ea6bba45698e5044fa2a')
|
||||
noextract=(cursor_${pkgver}_amd64.deb) # avoid double tarball
|
||||
sha512sums_x86_64=('f061675a7de3552feebda762d6ff5a296035e13527da9405c73e89cde9604137c52a1c8681ef29ad6aeb37b29ad6ab3733fe46e342950850241c91041c6613f8' '937299c6cb6be2f8d25f7dbc95cf77423875c5f8353b8bd6cd7cc8e5603cbf8405b14dbf8bd615db2e3b36ed680fc8e1909410815f7f8587b7267a699e00ab37' '793f9ff6306e3992ac89802d98110cba288ea1181a901467333293b7d76182ef9792c2a39ff49d9347a18a174b1f42bc58862091dff583f4146c2704eea28033' 'e79fe7659f59d1ae02fc68816399bfd31587315df6cdb6ccf1d0ca76f7cdc692c2a42b30591c0091147bd97ef14b1c7745dc26bd7cb3ea6bba45698e5044fa2a')
|
||||
source_aarch64=("https://downloads.cursor.com/production/${_commit}/linux/arm64/deb/arm64/deb/cursor_${pkgver}_arm64.deb")
|
||||
sha512sums_aarch64=('32d64ef0fdd9f672c374ea33a1d1d6b6b68df3f598f840b33215f5428c491deba1d587b93f4460ffe0f815126b928dd3befed8878b6fe6b3bcd375da8bed1716')
|
||||
noextract=(cursor_${pkgver}_amd64.deb cursor_${pkgver}_arm64.deb) # avoid double tarball
|
||||
_app=usr/share/cursor/resources/app
|
||||
package() {
|
||||
# Exclude electron
|
||||
bsdtar -xOf ${noextract[0]} data.tar.xz | tar -xJf - -C "$pkgdir" \
|
||||
--exclude 'usr/share/cursor/[^r]*' --exclude 'usr/share/cursor/*.pak'
|
||||
local deb="cursor_${pkgver}_amd64.deb"
|
||||
local -a excludes=(--exclude 'usr/share/cursor/[^r]*' --exclude 'usr/share/cursor/*.pak')
|
||||
if [[ "$CARCH" == aarch64 ]]; then
|
||||
deb="cursor_${pkgver}_arm64.deb"
|
||||
# Keep bundled Electron; omit Debian's AppArmor and sysctl settings.
|
||||
excludes=(--exclude './etc')
|
||||
fi
|
||||
bsdtar -xOf "${srcdir}/${deb}" data.tar.xz | tar -xJf - -C "$pkgdir" "${excludes[@]}"
|
||||
cd "$pkgdir"
|
||||
# Disable Cursor's bundled updater; Omarchy manages updates via pacman (#238).
|
||||
sed -i '/^[[:space:]]*"\(backupUpdateUrl\|updateUrl\)":/d' \
|
||||
"${_app}/product.json"
|
||||
mv usr/share/zsh/{vendor-completions,site-functions}
|
||||
if [[ "$CARCH" == aarch64 ]]; then
|
||||
install -d usr/bin
|
||||
ln -s /usr/share/cursor/bin/cursor usr/bin/cursor
|
||||
# Use Electron's unprivileged namespace sandbox.
|
||||
chmod 0755 usr/share/cursor/chrome-sandbox
|
||||
return
|
||||
fi
|
||||
ln -sf /usr/bin/node ${_app}/resources/helpers/node
|
||||
install -Dm755 "${srcdir}/rg.sh" ${_app}/node_modules/@vscode/ripgrep/bin/rg
|
||||
ln -sf /usr/bin/xdg-open ${_app}/node_modules/open/xdg-open
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Maintainer: Ismet Togay <ismet.togay at gmail dot com>
|
||||
# Contributor: Christopher Cooper <christopher@cg505.com>
|
||||
pkgname=cursor-cli
|
||||
pkgver=2026.09.18.1.9a7762b
|
||||
pkgver=2026.09.26.1.dd393fe
|
||||
# Upstream is YYYY.MM.DD-<hash>. pkgver cannot contain hyphens, and hashes are
|
||||
# not monotonically ordered, so pkgver is YYYY.MM.DD.<n>.<hash>: n resets to 1
|
||||
# on a new date and increments when the same date gets a new hash.
|
||||
@@ -25,8 +25,8 @@ source_x86_64=("cursor-cli-${_upstream_ver}-x86_64.tar.gz::https://downloads.cur
|
||||
source_aarch64=("cursor-cli-${_upstream_ver}-aarch64.tar.gz::https://downloads.cursor.com/lab/${_upstream_ver}/linux/arm64/agent-cli-package.tar.gz")
|
||||
b2sums=('d241ee9895bdb1c17514438fde8528222a8f2326568bd7a033d7a1b11432ce6b4575ff1a50625764bfe6bc6f8a9dc060f7439c3be7e95f8fd02912cdd37a011d'
|
||||
'1928e04c713e13911ea607f84c3e4a2fed1f76af9795503811078f43d2b53c753e28b2233e553fc17e766831800fb0dbc272aad2a80b387f95ba6071d7d4116a')
|
||||
b2sums_x86_64=('3fccee6929df1042d03461895e56c222a996d3ae9e4f9c61dcc5e6ab7b1d075d3265c21a44f48dd94de0dcde4f8012cc39bfbf323e2bb0c6106cac79885c35ae')
|
||||
b2sums_aarch64=('3d3bb0a3cb7e2409acf4925f207eaa4e3f41782c3c947e2834b69664b116b972da0b67eea17147fc524ea248af9919494570adc7c48d12c44f12deca17ba2c28')
|
||||
b2sums_x86_64=('799276ea8ba5dc410ff7e4ae1b9c095bcbaaa7ed6806a78ce249c10dbf9cc523a0ee5402f743e5a5a2cac87be59ffeff7a1b3dbb1ed062932dc300e2e57c9009')
|
||||
b2sums_aarch64=('417bfda50e13b9848f15ace73fb828632db766b54eb05bd0944bbe14ec49c780f870ea850d67dad40e073692e683436134056e24be5b3287bf8c481d713d9840')
|
||||
|
||||
prepare() {
|
||||
# Block cursor-agent auto-updates by making its versions directory
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
_pkgname="dbxcli"
|
||||
pkgname="${_pkgname}-bin"
|
||||
pkgver=3.7.3
|
||||
pkgver=3.7.4
|
||||
pkgrel=1
|
||||
pkgdesc="A command line client for Dropbox built using the Go SDK"
|
||||
arch=(
|
||||
@@ -33,9 +33,9 @@ source_armv7h=(
|
||||
source_x86_64=(
|
||||
"${url}/releases/download/v${pkgver}/${_pkgname}_${pkgver}_linux_amd64.tar.gz"
|
||||
)
|
||||
sha256sums_aarch64=('9d654da62a1ac10c9e32ee8f66fa6cc8d88ed29bc95555435a5ce4255eb4b96a')
|
||||
sha256sums_armv7h=('8067cee274dc2f062a06ceda26200c44d9251336ec235f7d7a3826743c9a379e')
|
||||
sha256sums_x86_64=('fee977ce4144174356cd7d1bae0b546aecad2570f14666bd44417e96af943484')
|
||||
sha256sums_aarch64=('c2101af4149ff4104dcfac515c85dedf3a9a3fdff43aac0d650c16df17fcf1f2')
|
||||
sha256sums_armv7h=('90311a7058ce706e38f6bac06461660308460f59e1c4e5ff5743e62eb3292097')
|
||||
sha256sums_x86_64=('eb9624bbe2c89287caa5b02ba120bc486d9f4c5ffb5f51d884fc7c40620da730')
|
||||
|
||||
prepare() {
|
||||
local source_array="source_${CARCH}[0]"
|
||||
|
||||
@@ -15,19 +15,15 @@ pkgver=10.0.401
|
||||
_runtimever=10.0.12
|
||||
_sdkver=$pkgver
|
||||
_short_ver=10.0
|
||||
pkgrel=1
|
||||
arch=('x86_64' 'armv7h' 'aarch64')
|
||||
pkgrel=2
|
||||
arch=('aarch64')
|
||||
url='https://www.microsoft.com/net/core'
|
||||
license=('MIT')
|
||||
options=('staticlibs')
|
||||
options=('staticlibs' '!debug')
|
||||
source=('dotnet.sh')
|
||||
source_armv7h=("https://builds.dotnet.microsoft.com/dotnet/Sdk/${_sdkver}/dotnet-sdk-${_sdkver}-linux-arm.tar.gz")
|
||||
source_aarch64=("https://builds.dotnet.microsoft.com/dotnet/Sdk/${_sdkver}/dotnet-sdk-${_sdkver}-linux-arm64.tar.gz")
|
||||
source_x86_64=("https://builds.dotnet.microsoft.com/dotnet/Sdk/${_sdkver}/dotnet-sdk-${_sdkver}-linux-x64.tar.gz")
|
||||
sha512sums=('768151c7179fb6a126b3de9cae01e363e8894f6fab384b1e2c5066c2adca4578638983b1b62aea10dd18045e6d6e8f8ea13280481134de94f004a118919b2c06')
|
||||
sha512sums_armv7h=('94a8a52862ca9f0de1075a468d6e4e307a1d4463098a9e8266e66939709a812b0126e212cce7e8c6feae6b078d86c8b77e088814a0e32531edb0da0a1ce90c11')
|
||||
sha512sums_aarch64=('58ace73ced6b4360754689a686bdfb8a317f4da6cb8bb416dbc7d0ba9f47e43e3c09f5eb1f1a1cfaacbd10df9558da4882bf2a5e195d6ab56a02c1f9f76102ed')
|
||||
sha512sums_x86_64=('51c8b999af9e8dd9998c9edc5944e19a90788862068acd38694e098889054ce8c23d4f0c5cccfa16bf187d044562359e5ee69a9f8ad0bbe913ba90311fbce25b')
|
||||
|
||||
# Keep each split package's notices usable when installed independently.
|
||||
_install_license() {
|
||||
@@ -110,12 +106,8 @@ package_dotnet-targeting-pack-bin() {
|
||||
provides=(dotnet-targeting-pack=${_runtimever} dotnet-targeting-pack-${_short_ver})
|
||||
conflicts=(dotnet-targeting-pack=${_runtimever} dotnet-targeting-pack-${_short_ver})
|
||||
|
||||
if [ $CARCH = 'x86_64' ]; then msarch=x64;
|
||||
elif [ $CARCH = 'armv7h' ]; then msarch=arm;
|
||||
elif [ $CARCH = 'aarch64' ]; then msarch=arm64; fi
|
||||
|
||||
install -dm 755 "${pkgdir}"/usr/share/{dotnet,dotnet/packs,licenses}
|
||||
cp -dr --no-preserve='ownership' packs/Microsoft.NETCore.App.{Host.linux-${msarch},Ref} "${pkgdir}"/usr/share/dotnet/packs/
|
||||
cp -dr --no-preserve='ownership' packs/Microsoft.NETCore.App.{Host.linux-arm64,Ref} "${pkgdir}"/usr/share/dotnet/packs/
|
||||
_install_license
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Maintainer: Andrej Benz <hello[at]benz[dot]dev>
|
||||
|
||||
pkgname=elephant-all
|
||||
pkgver=2.22.0
|
||||
pkgver=2.22.1
|
||||
pkgrel=1
|
||||
pkgdesc='elephant + all official elephant providers'
|
||||
url='https://github.com/abenz1267/elephant'
|
||||
@@ -12,7 +12,7 @@ makedepends=('go')
|
||||
conflicts=('elephant' 'elephant-playerctl' 'elephant-wireplumber' 'elephant-bitwarden' 'elephant-dnfpackages' 'elephant-1password' 'elephant-bookmarks' 'elephant-nirisessions' 'elephant-niriactions' 'elephant-archlinuxpkgs' 'elephant-bluetooth' 'elephant-calc' 'elephant-clipboard' 'elephant-desktopapplications' 'elephant-files' 'elephant-menus' 'elephant-providerlist' 'elephant-runner' 'elephant-snippets' 'elephant-symbols' 'elephant-todo' 'elephant-unicode' 'elephant-websearch' 'elephant-windows')
|
||||
provides=('elephant' 'elephant-playerctl' 'elephant-wireplumber' 'elephant-nirisessions' 'elephant-niriactions' 'elephant-archlinuxpkgs' 'elephant-bluetooth' 'elephant-calc' 'elephant-clipboard' 'elephant-desktopapplications' 'elephant-files' 'elephant-menus' 'elephant-providerlist' 'elephant-runner' 'elephant-snippets' 'elephant-symbols' 'elephant-todo' 'elephant-unicode' 'elephant-websearch' 'elephant-windows')
|
||||
source=("${url}/archive/refs/tags/v${pkgver}.tar.gz")
|
||||
sha256sums=('c6caa61727e4b5c3981099943b4b616c338a6e1b4e33b5e1d32078b8e4dbe120')
|
||||
sha256sums=('3d1d0d4c55ae531fa3f06406b96504b5165a0d7b53523d1f8351d9d93e457f44')
|
||||
|
||||
build() {
|
||||
# Build main elephant binary
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Maintainer: Andrej Benz <hello[at]benz[dot]dev>
|
||||
|
||||
pkgname=elephant-archlinuxpkgs
|
||||
pkgver=2.22.0
|
||||
pkgver=2.22.1
|
||||
pkgrel=1
|
||||
pkgdesc='archlinuxpkgs provider for elephant'
|
||||
url='https://github.com/abenz1267/elephant'
|
||||
@@ -11,7 +11,7 @@ makedepends=('go')
|
||||
conflicts=('elephant-archlinuxpkgs')
|
||||
provides=('elephant-archlinuxpkgs')
|
||||
source=("${url}/archive/refs/tags/v${pkgver}.tar.gz")
|
||||
sha256sums=('c6caa61727e4b5c3981099943b4b616c338a6e1b4e33b5e1d32078b8e4dbe120')
|
||||
sha256sums=('3d1d0d4c55ae531fa3f06406b96504b5165a0d7b53523d1f8351d9d93e457f44')
|
||||
|
||||
build() {
|
||||
cd elephant-${pkgver}/internal/providers/archlinuxpkgs
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Maintainer: Andrej Benz <hello[at]benz[dot]dev>
|
||||
|
||||
pkgname=elephant-bluetooth
|
||||
pkgver=2.22.0
|
||||
pkgver=2.22.1
|
||||
pkgrel=1
|
||||
pkgdesc='bluetooth provider for elephant'
|
||||
url='https://github.com/abenz1267/elephant'
|
||||
@@ -11,7 +11,7 @@ makedepends=('go')
|
||||
conflicts=('elephant-bluetooth')
|
||||
provides=('elephant-bluetooth')
|
||||
source=("${url}/archive/refs/tags/v${pkgver}.tar.gz")
|
||||
sha256sums=('c6caa61727e4b5c3981099943b4b616c338a6e1b4e33b5e1d32078b8e4dbe120')
|
||||
sha256sums=('3d1d0d4c55ae531fa3f06406b96504b5165a0d7b53523d1f8351d9d93e457f44')
|
||||
|
||||
build() {
|
||||
cd elephant-${pkgver}/internal/providers/bluetooth
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Maintainer: Andrej Benz <hello[at]benz[dot]dev>
|
||||
|
||||
pkgname=elephant-calc
|
||||
pkgver=2.22.0
|
||||
pkgver=2.22.1
|
||||
pkgrel=1
|
||||
pkgdesc='calc provider for elephant'
|
||||
url='https://github.com/abenz1267/elephant'
|
||||
@@ -12,7 +12,7 @@ makedepends=('go')
|
||||
conflicts=('elephant-calc')
|
||||
provides=('elephant-calc')
|
||||
source=("${url}/archive/refs/tags/v${pkgver}.tar.gz")
|
||||
sha256sums=('c6caa61727e4b5c3981099943b4b616c338a6e1b4e33b5e1d32078b8e4dbe120')
|
||||
sha256sums=('3d1d0d4c55ae531fa3f06406b96504b5165a0d7b53523d1f8351d9d93e457f44')
|
||||
|
||||
build() {
|
||||
cd elephant-${pkgver}/internal/providers/calc
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Maintainer: Andrej Benz <hello[at]benz[dot]dev>
|
||||
|
||||
pkgname=elephant-clipboard
|
||||
pkgver=2.22.0
|
||||
pkgver=2.22.1
|
||||
pkgrel=1
|
||||
pkgdesc='clipboard provider for elephant'
|
||||
url='https://github.com/abenz1267/elephant'
|
||||
@@ -12,7 +12,7 @@ makedepends=('go')
|
||||
conflicts=('elephant-clipboard')
|
||||
provides=('elephant-clipboard')
|
||||
source=("${url}/archive/refs/tags/v${pkgver}.tar.gz")
|
||||
sha256sums=('c6caa61727e4b5c3981099943b4b616c338a6e1b4e33b5e1d32078b8e4dbe120')
|
||||
sha256sums=('3d1d0d4c55ae531fa3f06406b96504b5165a0d7b53523d1f8351d9d93e457f44')
|
||||
|
||||
build() {
|
||||
cd elephant-${pkgver}/internal/providers/clipboard
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Maintainer: Andrej Benz <hello[at]benz[dot]dev>
|
||||
|
||||
pkgname=elephant-desktopapplications
|
||||
pkgver=2.22.0
|
||||
pkgver=2.22.1
|
||||
pkgrel=1
|
||||
pkgdesc='desktopapplications provider for elephant'
|
||||
url='https://github.com/abenz1267/elephant'
|
||||
@@ -11,7 +11,7 @@ makedepends=('go')
|
||||
conflicts=('elephant-desktopapplications')
|
||||
provides=('elephant-desktopapplications')
|
||||
source=("${url}/archive/refs/tags/v${pkgver}.tar.gz")
|
||||
sha256sums=('c6caa61727e4b5c3981099943b4b616c338a6e1b4e33b5e1d32078b8e4dbe120')
|
||||
sha256sums=('3d1d0d4c55ae531fa3f06406b96504b5165a0d7b53523d1f8351d9d93e457f44')
|
||||
|
||||
build() {
|
||||
cd elephant-${pkgver}/internal/providers/desktopapplications
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Maintainer: Andrej Benz <hello[at]benz[dot]dev>
|
||||
|
||||
pkgname=elephant-files
|
||||
pkgver=2.22.0
|
||||
pkgver=2.22.1
|
||||
pkgrel=1
|
||||
pkgdesc='files provider for elephant'
|
||||
url='https://github.com/abenz1267/elephant'
|
||||
@@ -12,7 +12,7 @@ makedepends=('go')
|
||||
conflicts=('elephant-files')
|
||||
provides=('elephant-files')
|
||||
source=("${url}/archive/refs/tags/v${pkgver}.tar.gz")
|
||||
sha256sums=('c6caa61727e4b5c3981099943b4b616c338a6e1b4e33b5e1d32078b8e4dbe120')
|
||||
sha256sums=('3d1d0d4c55ae531fa3f06406b96504b5165a0d7b53523d1f8351d9d93e457f44')
|
||||
|
||||
build() {
|
||||
cd elephant-${pkgver}/internal/providers/files
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Maintainer: Andrej Benz <hello[at]benz[dot]dev>
|
||||
|
||||
pkgname=elephant-menus
|
||||
pkgver=2.22.0
|
||||
pkgver=2.22.1
|
||||
pkgrel=1
|
||||
pkgdesc='menus provider for elephant'
|
||||
url='https://github.com/abenz1267/elephant'
|
||||
@@ -11,7 +11,7 @@ makedepends=('go')
|
||||
conflicts=('elephant-menus')
|
||||
provides=('elephant-menus')
|
||||
source=("${url}/archive/refs/tags/v${pkgver}.tar.gz")
|
||||
sha256sums=('c6caa61727e4b5c3981099943b4b616c338a6e1b4e33b5e1d32078b8e4dbe120')
|
||||
sha256sums=('3d1d0d4c55ae531fa3f06406b96504b5165a0d7b53523d1f8351d9d93e457f44')
|
||||
|
||||
build() {
|
||||
cd elephant-${pkgver}/internal/providers/menus
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Maintainer: Andrej Benz <hello[at]benz[dot]dev>
|
||||
|
||||
pkgname=elephant-providerlist
|
||||
pkgver=2.22.0
|
||||
pkgver=2.22.1
|
||||
pkgrel=1
|
||||
pkgdesc='providerlist provider for elephant'
|
||||
url='https://github.com/abenz1267/elephant'
|
||||
@@ -11,7 +11,7 @@ makedepends=('go')
|
||||
conflicts=('elephant-providerlist')
|
||||
provides=('elephant-providerlist')
|
||||
source=("${url}/archive/refs/tags/v${pkgver}.tar.gz")
|
||||
sha256sums=('c6caa61727e4b5c3981099943b4b616c338a6e1b4e33b5e1d32078b8e4dbe120')
|
||||
sha256sums=('3d1d0d4c55ae531fa3f06406b96504b5165a0d7b53523d1f8351d9d93e457f44')
|
||||
|
||||
build() {
|
||||
cd elephant-${pkgver}/internal/providers/providerlist
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Maintainer: Andrej Benz <hello[at]benz[dot]dev>
|
||||
|
||||
pkgname=elephant-runner
|
||||
pkgver=2.22.0
|
||||
pkgver=2.22.1
|
||||
pkgrel=1
|
||||
pkgdesc='runner provider for elephant'
|
||||
url='https://github.com/abenz1267/elephant'
|
||||
@@ -11,7 +11,7 @@ makedepends=('go')
|
||||
conflicts=('elephant-runner')
|
||||
provides=('elephant-runner')
|
||||
source=("${url}/archive/refs/tags/v${pkgver}.tar.gz")
|
||||
sha256sums=('c6caa61727e4b5c3981099943b4b616c338a6e1b4e33b5e1d32078b8e4dbe120')
|
||||
sha256sums=('3d1d0d4c55ae531fa3f06406b96504b5165a0d7b53523d1f8351d9d93e457f44')
|
||||
|
||||
build() {
|
||||
cd elephant-${pkgver}/internal/providers/runner
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Maintainer: Andrej Benz <hello[at]benz[dot]dev>
|
||||
|
||||
pkgname=elephant-symbols
|
||||
pkgver=2.22.0
|
||||
pkgver=2.22.1
|
||||
pkgrel=1
|
||||
pkgdesc='symbols provider for elephant'
|
||||
url='https://github.com/abenz1267/elephant'
|
||||
@@ -11,7 +11,7 @@ makedepends=('go')
|
||||
conflicts=('elephant-symbols')
|
||||
provides=('elephant-symbols')
|
||||
source=("${url}/archive/refs/tags/v${pkgver}.tar.gz")
|
||||
sha256sums=('c6caa61727e4b5c3981099943b4b616c338a6e1b4e33b5e1d32078b8e4dbe120')
|
||||
sha256sums=('3d1d0d4c55ae531fa3f06406b96504b5165a0d7b53523d1f8351d9d93e457f44')
|
||||
|
||||
build() {
|
||||
cd elephant-${pkgver}/internal/providers/symbols
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Maintainer: Andrej Benz <hello[at]benz[dot]dev>
|
||||
|
||||
pkgname=elephant-todo
|
||||
pkgver=2.22.0
|
||||
pkgver=2.22.1
|
||||
pkgrel=1
|
||||
pkgdesc='todo provider for elephant'
|
||||
url='https://github.com/abenz1267/elephant'
|
||||
@@ -11,7 +11,7 @@ makedepends=('go')
|
||||
conflicts=('elephant-todo')
|
||||
provides=('elephant-todo')
|
||||
source=("${url}/archive/refs/tags/v${pkgver}.tar.gz")
|
||||
sha256sums=('c6caa61727e4b5c3981099943b4b616c338a6e1b4e33b5e1d32078b8e4dbe120')
|
||||
sha256sums=('3d1d0d4c55ae531fa3f06406b96504b5165a0d7b53523d1f8351d9d93e457f44')
|
||||
|
||||
build() {
|
||||
cd elephant-${pkgver}/internal/providers/todo
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Maintainer: Andrej Benz <hello[at]benz[dot]dev>
|
||||
|
||||
pkgname=elephant-unicode
|
||||
pkgver=2.22.0
|
||||
pkgver=2.22.1
|
||||
pkgrel=1
|
||||
pkgdesc='unicode provider for elephant'
|
||||
url='https://github.com/abenz1267/elephant'
|
||||
@@ -11,7 +11,7 @@ makedepends=('go')
|
||||
conflicts=('elephant-unicode')
|
||||
provides=('elephant-unicode')
|
||||
source=("${url}/archive/refs/tags/v${pkgver}.tar.gz")
|
||||
sha256sums=('c6caa61727e4b5c3981099943b4b616c338a6e1b4e33b5e1d32078b8e4dbe120')
|
||||
sha256sums=('3d1d0d4c55ae531fa3f06406b96504b5165a0d7b53523d1f8351d9d93e457f44')
|
||||
|
||||
build() {
|
||||
cd elephant-${pkgver}/internal/providers/unicode
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Maintainer: Andrej Benz <hello[at]benz[dot]dev>
|
||||
|
||||
pkgname=elephant-websearch
|
||||
pkgver=2.22.0
|
||||
pkgver=2.22.1
|
||||
pkgrel=1
|
||||
pkgdesc='websearch provider for elephant'
|
||||
url='https://github.com/abenz1267/elephant'
|
||||
@@ -11,7 +11,7 @@ makedepends=('go')
|
||||
conflicts=('elephant-websearch')
|
||||
provides=('elephant-websearch')
|
||||
source=("${url}/archive/refs/tags/v${pkgver}.tar.gz")
|
||||
sha256sums=('c6caa61727e4b5c3981099943b4b616c338a6e1b4e33b5e1d32078b8e4dbe120')
|
||||
sha256sums=('3d1d0d4c55ae531fa3f06406b96504b5165a0d7b53523d1f8351d9d93e457f44')
|
||||
|
||||
build() {
|
||||
cd elephant-${pkgver}/internal/providers/websearch
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Maintainer: Andrej Benz <hello[at]benz[dot]dev>
|
||||
|
||||
pkgname=elephant
|
||||
pkgver=2.22.0
|
||||
pkgver=2.22.1
|
||||
pkgrel=1
|
||||
pkgdesc='general purpose datasource and executor'
|
||||
url='https://github.com/abenz1267/elephant'
|
||||
@@ -11,7 +11,7 @@ makedepends=('go')
|
||||
conflicts=('elephant')
|
||||
provides=('elephant')
|
||||
source=("${url}/archive/refs/tags/v${pkgver}.tar.gz")
|
||||
sha256sums=('c6caa61727e4b5c3981099943b4b616c338a6e1b4e33b5e1d32078b8e4dbe120')
|
||||
sha256sums=('3d1d0d4c55ae531fa3f06406b96504b5165a0d7b53523d1f8351d9d93e457f44')
|
||||
|
||||
build() {
|
||||
cd ${pkgname}-${pkgver}/cmd/elephant
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
# elsewhen
|
||||
|
||||
Installs the Elsewhen world clock plugin from the `v{pkgver}` GitHub tag archive into `/usr/share/omarchy/shell/plugins/omacom.elsewhen/` (the directory name is the plugin id the shell scans for, not the package name), plus `LICENSE` under `/usr/share/licenses/elsewhen/` and the upstream `README.md` under `/usr/share/doc/elsewhen/`. The shell scans this directory alongside its bundled plugins.
|
||||
|
||||
`package()` copies an explicit allow-list (`manifest.json`, every `*.qml` and `*.js`, `cities.json`, `world.json`, `worldclock-data.py`), so `tests/`, `.github/` and `.gitignore` never ship, and it fails the build if `manifest.json` is missing, does not declare `omacom.elsewhen`, or does not name a present `Panel.qml` as the entry point. An upstream release that adds a runtime file outside those patterns needs the allow-list extended here; the sync only moves versions and checksums. Every file is 0644: `Panel.qml` runs the script as `python3 <plugin dir>/worldclock-data.py`, so it needs no execute bit. No install hook: Omarchy restarts the shell after `omarchy update`, and nothing here may write into a user home. The script's only writes go to `$XDG_CACHE_HOME/omacom-elsewhen/`, which it creates itself at runtime.
|
||||
|
||||
Dependencies, cited as `file: tool` in the upstream tree:
|
||||
|
||||
- `omarchy`: `ArcText.qml`, `Chip.qml`, `EarthRow.qml`, `Globe.qml`, `MiniGlobe.qml`, `MoonDot.qml`, `Panel.qml: import qs.Commons`; `EarthRow.qml`, `Globe.qml`, `Panel.qml: import qs.Ui`. Owns `/usr/share/omarchy` and the shell plugin directory.
|
||||
- `quickshell`: `Globe.qml`, `Panel.qml: import Quickshell`; `Globe.qml`, `MiniGlobe.qml`, `Panel.qml: import Quickshell.Io` (`Process`, `FileView`, `StdioCollector`).
|
||||
- `python`: `Panel.qml: python3 <plugin dir>/worldclock-data.py` (the facts process). `worldclock-data.py` imports only `json`, `os`, `sys`, `time`, `urllib`.
|
||||
- Left implicit as members of `base`, per Arch convention: `bash` (`Panel.qml`, `Globe.qml: bash -c` wraps every probe), `coreutils` (`Panel.qml`, `Globe.qml: date`, one probe per refresh), `systemd` (`Panel.qml: timedatectl show`, `timedatectl list-timezones`, each with a fallback: `/etc/localtime` for the home zone and `find /usr/share/zoneinfo` for the catalog), `sed` and `grep` (`Panel.qml`: the symlink target of `/etc/localtime` and the zoneinfo catalog filter), `findutils` and `tzdata` (that fallback; `worldclock-data.py: /usr/share/zoneinfo/zone1970.tab`). `omarchy` cannot run without any of them either.
|
||||
- Not a dependency: `iso-codes`. Only `tests/currency_check.py` reads `/usr/share/iso-codes/json`, to validate the currency table before a release; the runtime never touches it.
|
||||
|
||||
Release tracking: `bin/sync-upstream` follows `omacom/elsewhen` through the `upstream.watch.github` provider, which reads the GitHub Releases feed (drafts and prereleases excluded; a tag with no published Release is not seen) and matches exactly `vX.Y.Z`, the grammar upstream's `scripts/set-version.sh` enforces. A newer release rewrites `pkgver`, resets `pkgrel` to 1, fetches `archive/refs/tags/v{pkgver}.tar.gz` again and rewrites `sha256sums` from the download. The Release's `published_at` is what lets `min_release_age: 24h` hold a fresh release for a day; `release_ring: fast` builds it straight to rc and stable as well as edge.
|
||||
|
||||
The watch only moves on a version increase, so the first release's digest is filled in by hand (`curl -fsSL <archive url> | sha256sum`), which is why the recipe carries a placeholder until the `v0.1.0` tag exists. Until upstream has published at least one Release, the watch finds nothing and fails the scheduled `sync-upstream` run for every package in the batch, so this recipe stays a draft until then.
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"source": "local",
|
||||
"release_ring": "fast",
|
||||
"min_release_age": "24h",
|
||||
"upstream": {
|
||||
"watch": {
|
||||
"github": "omacom/elsewhen",
|
||||
"pattern": "v(?P<version>[0-9]+\\.[0-9]+\\.[0-9]+)"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,63 +0,0 @@
|
||||
# Maintainer: Spencer Bull <spencer.bull@hey.com>
|
||||
|
||||
pkgname=elsewhen
|
||||
pkgver=1.0.0
|
||||
pkgrel=2
|
||||
pkgdesc='World clock plugin for the Omarchy shell'
|
||||
arch=('any')
|
||||
url='https://github.com/omacom/elsewhen'
|
||||
license=('MIT')
|
||||
|
||||
# What the plugin needs to load and run. It also shells out to bash, date
|
||||
# (coreutils) and timedatectl (systemd) and reads /usr/share/zoneinfo
|
||||
# (tzdata); those are members of the base group and stay implicit, per Arch
|
||||
# convention. The citations for each entry are in .omarchy/README.md.
|
||||
depends=(
|
||||
'omarchy'
|
||||
'python'
|
||||
'quickshell'
|
||||
)
|
||||
|
||||
options=('!debug')
|
||||
|
||||
source=("$pkgname-$pkgver.tar.gz::$url/archive/refs/tags/v$pkgver.tar.gz")
|
||||
sha256sums=('3124f0c0a19ebc1b158bcf04151cddd6c733ceeead88052186b6a54c46bee263')
|
||||
|
||||
package() {
|
||||
# Install alongside the bundled plugins in the shell's plugin directory.
|
||||
local plugin="$pkgdir/usr/share/omarchy/shell/plugins/omacom.elsewhen"
|
||||
cd "$srcdir/$pkgname-$pkgver" || return 1
|
||||
|
||||
# The shell loads the entry point each manifest declares. A tree without
|
||||
# either would install cleanly and never load, so fail the build instead of
|
||||
# shipping it.
|
||||
[[ -f manifest.json ]] || {
|
||||
echo "release tree is missing manifest.json" >&2
|
||||
return 1
|
||||
}
|
||||
grep -Eq '"id"[[:space:]]*:[[:space:]]*"omacom\.elsewhen"' manifest.json || {
|
||||
echo "manifest.json does not declare the plugin id omacom.elsewhen" >&2
|
||||
return 1
|
||||
}
|
||||
grep -Eq '"barWidget"[[:space:]]*:[[:space:]]*"Panel\.qml"' manifest.json || {
|
||||
echo "manifest.json does not name Panel.qml as the bar widget entry point" >&2
|
||||
return 1
|
||||
}
|
||||
[[ -f Panel.qml ]] || {
|
||||
echo "release tree is missing the entry point Panel.qml" >&2
|
||||
return 1
|
||||
}
|
||||
|
||||
# An explicit allow-list of runtime files, so tests/, .github/ and the rest
|
||||
# of the repository never reach the package. Directories end up 0755 and
|
||||
# every file 0644: worldclock-data.py runs as `python3 <path>` and needs no
|
||||
# execute bit. An unmatched glob is left literal and fails install, which
|
||||
# is the right outcome for a release tree missing its QML or JS.
|
||||
local file
|
||||
for file in manifest.json cities.json world.json worldclock-data.py *.qml *.js; do
|
||||
install -Dm644 "$file" "$plugin/$file"
|
||||
done
|
||||
|
||||
install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
|
||||
install -Dm644 README.md "$pkgdir/usr/share/doc/$pkgname/README.md"
|
||||
}
|
||||
@@ -1,6 +1,12 @@
|
||||
#!/bin/bash
|
||||
# Verify Flea's published source archive against its checksum manifest when a
|
||||
# newer stable release exists, then check its root and required security fixes.
|
||||
# newer stable release exists, then check its root.
|
||||
#
|
||||
# Through 0.1.x this also grepped the source for the upstream security fixes
|
||||
# Omarchy once carried as patches, so the package could not move to a release
|
||||
# that lacked them. Every release since 0.1.5 has had them, and matching
|
||||
# literal source lines only ever caught renames (#488, 0.3.5's
|
||||
# open_if_regular_with_meta), never a regression.
|
||||
set -euo pipefail
|
||||
|
||||
REPO='thisisgm/flea'
|
||||
@@ -74,38 +80,6 @@ if [[ $served_roots != "$expected_root" ]]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
archive_rs=$(tar -xOzf "$tarball" "$expected_root/src/backend/archive.rs")
|
||||
archiveops_rs=$(tar -xOzf "$tarball" "$expected_root/src/backend/archiveops.rs")
|
||||
run_rs=$(tar -xOzf "$tarball" "$expected_root/src/backend/run.rs")
|
||||
archivereq_rs=$(tar -xOzf "$tarball" "$expected_root/src/backend/archivereq.rs")
|
||||
archivework_rs=$(tar -xOzf "$tarball" "$expected_root/src/backend/archivework.rs")
|
||||
mediaprobe_rs=$(tar -xOzf "$tarball" "$expected_root/src/backend/mediaprobe.rs")
|
||||
metareq_rs=$(tar -xOzf "$tarball" "$expected_root/src/backend/metareq.rs")
|
||||
sharelink_qml=$(tar -xOzf "$tarball" "$expected_root/ui/ShareLink.qml")
|
||||
copyfile_rs=$(tar -xOzf "$tarball" "$expected_root/src/backend/copyfile.rs")
|
||||
regfile_rs=$(tar -xOzf "$tarball" "$expected_root/src/backend/regfile.rs")
|
||||
|
||||
# Every check below pins a literal line except the O_NOFOLLOW one. That check
|
||||
# guards a property -- the copy opens its source with O_NOFOLLOW, so a symlink
|
||||
# swapped in cannot redirect the read -- and pinning the exact call expression
|
||||
# made it assert the spelling instead. v0.3.0 moved the first argument from
|
||||
# `src` to `src.at` when directory-relative opens landed, kept O_NOFOLLOW, and
|
||||
# hardened symlink handling further; the literal still refused it. Match the
|
||||
# call and the flag together so a rename cannot read as a removed fix, while
|
||||
# dropping O_NOFOLLOW still fails.
|
||||
if ! grep -Fq 'a.push("--".to_string());' <<<"$archive_rs" ||
|
||||
! grep -Fq 'let input = std::fs::canonicalize(input)' <<<"$archiveops_rs" ||
|
||||
! grep -Fq 'if op != "compress" && op != "extract"' <<<"$run_rs$archivereq_rs" ||
|
||||
! grep -Fq 'the sandbox is unavailable: bwrap or prlimit is not on PATH' <<<"$archivework_rs" ||
|
||||
! grep -Fq 'if !sandbox::available()' <<<"$mediaprobe_rs" ||
|
||||
! grep -Fq 'if !sandbox::available()' <<<"$metareq_rs" ||
|
||||
! grep -Fq 'copyToClipboard.command = ["wl-copy", url]' <<<"$sharelink_qml" ||
|
||||
! grep -Eq 'open_if_regular\(.*O_NOFOLLOW' <<<"$copyfile_rs" ||
|
||||
! grep -Fq '.custom_flags(O_NONBLOCK | extra_flags)' <<<"$regfile_rs"; then
|
||||
printf 'Release %s does not contain every required upstream security fix\n' "$best_tag" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
jq -n \
|
||||
--arg pkgver "$best_version" \
|
||||
--arg published_at "$best_published_at" \
|
||||
|
||||
+20
-3
@@ -1,8 +1,8 @@
|
||||
# Maintainer: GM <gianmarcomorales@icloud.com>
|
||||
|
||||
pkgname=flea
|
||||
pkgver=0.3.1
|
||||
pkgrel=2
|
||||
pkgver=0.3.5
|
||||
pkgrel=1
|
||||
pkgdesc='Fast, keyboard-first file manager for Omarchy'
|
||||
arch=('x86_64' 'aarch64')
|
||||
url='https://github.com/thisisgm/flea'
|
||||
@@ -52,7 +52,7 @@ options=('!debug')
|
||||
source=(
|
||||
"$url/releases/download/v$pkgver/$pkgname-v$pkgver.tar.gz"
|
||||
)
|
||||
sha256sums=('b146ac3f5025da987eae623c4392c44ce69a6a7275a8df3ec1a84563920a4dd2')
|
||||
sha256sums=('947bd1ad17238e6402af044f848662a4c20e9a82e5a61062ef2e10bb6c2d4cfe')
|
||||
|
||||
build() {
|
||||
cd "$pkgname-$pkgver"
|
||||
@@ -115,7 +115,12 @@ check() {
|
||||
# back to the next create, so on the builder's /tmp the stranger is
|
||||
# identical and undo walks it back. tmpfs allocates inode numbers from a
|
||||
# counter and never reuses one, which is what the test assumes.
|
||||
# copymanifest's garbage-stream test opens its O_TMPFILE manifest in its
|
||||
# own test dir; the module's other tests must stay off tmpfs, because
|
||||
# Writer::create wants a runtime dir on a different filesystem from the
|
||||
# copy and finds none when both live on /dev/shm.
|
||||
local -a filesystem_tests=(
|
||||
backend::copymanifest::tests::a_garbage_stream_falls_back_with_the_tree_untouched
|
||||
backend::menu_actions::tests::
|
||||
backend::menudelete::tests::
|
||||
backend::redo::tests::
|
||||
@@ -151,6 +156,18 @@ check() {
|
||||
--skip backend::child::tests::a_child_that_never_started_is_told_apart_from_one_that_ran_and_failed
|
||||
--skip backend::menu_registry::tests::unavailable_failed_and_oversized_queries_are_named_errors
|
||||
)
|
||||
# deep_directory_tree_fits_the_worker_stack sizes a tree 1900 folders
|
||||
# deep and expects a complete answer, but the listing walk stops at its
|
||||
# 2000 ms deadline (dirsize::DEADLINE_MS) and reports partial; emulated
|
||||
# read_dir over paths near PATH_MAX does not finish in time.
|
||||
# closing_a_query_kills_its_process_group_and_releases_the_service
|
||||
# cancels an `sh -c 'sleep 600 & wait'` child the moment it is
|
||||
# registered and waits 5 s for the capture to return. Unchanged since
|
||||
# 0.3.1, which passed it here; under emulation it now loses that race.
|
||||
test_args+=(
|
||||
--skip backend::dirsizeworker::tests::deep_directory_tree_fits_the_worker_stack
|
||||
--skip backend::menu_registry::tests::closing_a_query_kills_its_process_group_and_releases_the_service
|
||||
)
|
||||
fi
|
||||
|
||||
local test_tmp test_status=0 suite
|
||||
|
||||
@@ -6,7 +6,7 @@ _npmmodule=@github/copilot
|
||||
pkgname=github-copilot-cli
|
||||
_pkgexec=copilot
|
||||
|
||||
pkgver=1.0.86
|
||||
pkgver=1.0.88
|
||||
pkgrel=1
|
||||
|
||||
pkgdesc="GitHub Copilot CLI brings the power of Copilot coding agent directly to your terminal."
|
||||
@@ -31,8 +31,8 @@ source=("https://registry.npmjs.org/${_npmmodule}/-/copilot-${pkgver}.tgz"
|
||||
noextract=("copilot-${pkgver}.tgz")
|
||||
|
||||
sha256sums=(
|
||||
'4c6433345f08199e96dcf8db1c3e46a337dfab96cea32132d6127ffcd63a6200'
|
||||
'b94d2aab574cf3e0c8d950e72430186cdd918261a1376146de971fa90ba0a672'
|
||||
'2ccb1e1d287ddd3c4d74ef02d95ee0151d2d6a3e1fc5e18a3756de211f0d8193'
|
||||
'782da64fdc6608e595aa03125d4a1fd0a5430f86cdf3c79b22166a5660dc5dff'
|
||||
)
|
||||
|
||||
# Document: https://wiki.archlinux.org/title/Node.js_package_guidelines
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
[google-chrome]
|
||||
source = "apt"
|
||||
mirror = "https://dl.google.com/linux/chrome/deb/"
|
||||
pkg = "google-chrome-stable"
|
||||
suite = "stable"
|
||||
repo = "main"
|
||||
strip_release = true
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"source": "local",
|
||||
"release_ring": "fast",
|
||||
"upstream": {
|
||||
"watch": {
|
||||
"debian": "https://dl.google.com/linux/chrome/deb/dists/stable/main/binary-amd64/Packages",
|
||||
"package": "google-chrome-stable",
|
||||
"pattern": "(?P<version>[0-9]+(?:\\.[0-9]+)*)-1"
|
||||
}
|
||||
},
|
||||
"origin": {
|
||||
"aur": "google-chrome",
|
||||
"commit": "6bd49a411277b3f9bcc9e58ce0c579292db75804"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
# Maintainer: Christian Heusel <christian@heusel.eu>
|
||||
# Contributor: Knut Ahlers <knut at ahlers dot me>
|
||||
# Contributor: Det <nimetonmaili g-mail>
|
||||
# Contributor: t3ddy, Lex Rivera aka x-demon, ruario, Abdullah
|
||||
|
||||
# Check for new Linux releases in: http://googlechromereleases.blogspot.com/search/label/Stable%20updates
|
||||
# or use: $ curl -sSf https://dl.google.com/linux/chrome/deb/dists/stable/main/binary-amd64/Packages | grep -A1 "Package: google-chrome-stable" | awk '/Version/{print $2}' | cut -d '-' -f1
|
||||
|
||||
pkgname=google-chrome
|
||||
pkgver=154.0.8037.57
|
||||
pkgrel=1
|
||||
pkgdesc="The popular web browser by Google (Stable Channel)"
|
||||
arch=(
|
||||
'x86_64'
|
||||
'aarch64'
|
||||
)
|
||||
url="https://www.google.com/chrome"
|
||||
license=('custom:chrome')
|
||||
depends=(
|
||||
'alsa-lib'
|
||||
'gtk3'
|
||||
'libcups'
|
||||
'libxss'
|
||||
'libxtst'
|
||||
'nss'
|
||||
'ttf-liberation'
|
||||
'xdg-utils'
|
||||
)
|
||||
optdepends=(
|
||||
'pipewire: WebRTC desktop sharing under Wayland'
|
||||
'kdialog: for file dialogs in KDE'
|
||||
'gnome-keyring: for storing passwords in GNOME keyring'
|
||||
'kwallet: for storing passwords in KWallet'
|
||||
)
|
||||
options=('!emptydirs' '!strip')
|
||||
install=$pkgname.install
|
||||
_channel=stable
|
||||
source=('eula_text.html'
|
||||
"google-chrome-$_channel.sh")
|
||||
sha512sums=('a225555c06b7c32f9f2657004558e3f996c981481dbb0d3cd79b1d59fa3f05d591af88399422d3ab29d9446c103e98d567aeafe061d9550817ab6e7eb0498396'
|
||||
'de02b498a4b5b93e21622c8dba57befe795d733a04656be911cc38e28bfef0e20470450f44be523bbde8d4de28f79c10434846ca01fc2a2f4e67707b79332f94')
|
||||
sha512sums_x86_64=('503bfdac8639dddeb44c339b37a295383a5a766e47204b26f4e3e11b550937a1e1c1b0c41d63c3bcbbcf26795d53a2b731385065c9245fb5509f33e59cff6864')
|
||||
sha512sums_aarch64=('b409cd701801d0e1c204c4eede536d9439a481db5b5ab6e475016f8845cfc3d47ae656412fac6e0988072d05037f3a94a4059ac2b0534b6f283471b8778bf6c3')
|
||||
|
||||
source_x86_64=("https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-${_channel}/google-chrome-${_channel}_${pkgver}-1_amd64.deb")
|
||||
source_aarch64=("https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-${_channel}/google-chrome-${_channel}_${pkgver}-1_arm64.deb")
|
||||
|
||||
package() {
|
||||
bsdtar -xf data.tar.xz -C "$pkgdir/"
|
||||
|
||||
# Launcher
|
||||
install -m755 google-chrome-$_channel.sh "$pkgdir"/usr/bin/google-chrome-$_channel
|
||||
|
||||
# Icons
|
||||
for i in 16x16 24x24 32x32 48x48 64x64 128x128 256x256; do
|
||||
install -Dm644 "$pkgdir"/opt/google/chrome/product_logo_${i/x*/}.png \
|
||||
"$pkgdir"/usr/share/icons/hicolor/$i/apps/google-chrome.png
|
||||
done
|
||||
|
||||
# License
|
||||
install -Dm644 eula_text.html "$pkgdir"/usr/share/licenses/google-chrome/eula_text.html
|
||||
install -Dm644 "$pkgdir"/opt/google/chrome/WidevineCdm/LICENSE \
|
||||
"$pkgdir"/usr/share/licenses/google-chrome-$_channel/WidevineCdm-LICENSE.txt
|
||||
|
||||
# Fix the Chrome desktop entry
|
||||
sed -i \
|
||||
-e "/Exec=/i\StartupWMClass=Google-chrome" \
|
||||
-e "s/x-scheme-handler\/ftp;\?//g" \
|
||||
"$pkgdir"/usr/share/applications/google-chrome.desktop
|
||||
|
||||
# Remove the Debian Cron job, duplicate product logos and menu directory
|
||||
rm -r \
|
||||
"$pkgdir"/etc/cron.daily/ \
|
||||
"$pkgdir"/opt/google/chrome/cron/ \
|
||||
"$pkgdir"/opt/google/chrome/product_logo_*.png
|
||||
}
|
||||
@@ -0,0 +1,901 @@
|
||||
<!DOCTYPE html>
|
||||
<html class="no-js consumer" data-country="us" lang="en">
|
||||
<head>
|
||||
|
||||
<script>
|
||||
var a=location.href.match(/platform=(win8|win|mac|linux|cros|ios)/),b=window.navigator.userAgent;document.documentElement.id=a&&a[1]||(-1<b.indexOf("Windows NT 6.2")?"win8":-1<b.indexOf("iPad")?"ios":-1<b.indexOf("Windows")?"win":-1<b.indexOf("Mac")?"mac":-1<b.indexOf("CrOS")?"cros":"linux");
|
||||
if(-1<b.indexOf("MSIE")){var c=-1<b.indexOf("MSIE 6")?" lt-ie10 lt-ie9 lt-ie8 lt-ie7 ie6":-1<b.indexOf("MSIE 7")?" lt-ie10 lt-ie9 lt-ie8 ie7":-1<b.indexOf("MSIE 8")?" lt-ie10 lt-ie9 ie8":-1<b.indexOf("MSIE 9")?" lt-ie10 ie9":-1<b.indexOf("MSIE 10")?" ie10":"";""!==c&&(document.documentElement.className+=c)}if(-1<b.indexOf("Windows NT 5.1")||-1<b.indexOf("Windows NT 5.2"))document.documentElement.className+=" winXP";
|
||||
</script>
|
||||
<script src="//www.gstatic.com/external_hosted/modernizr/modernizr.js">
|
||||
</script>
|
||||
<meta charset="utf-8">
|
||||
<meta content="initial-scale=1, minimum-scale=1, width=device-width" name="viewport">
|
||||
<meta content="View the full Terms of Service agreement for Google Chrome" name="description">
|
||||
<title>
|
||||
Google Chrome Terms of Service
|
||||
</title>
|
||||
<link href="https://plus.google.com/100585555255542998765" rel="publisher">
|
||||
<link href="//www.google.com/images/icons/product/chrome-32.png" rel="icon" type="image/ico">
|
||||
<link href="https://www.google.com/chrome/browser/privacy/eula_text.html" rel="canonical">
|
||||
<style>
|
||||
body {
|
||||
font-family: Arial;
|
||||
font-size: 13px;
|
||||
}
|
||||
</style>
|
||||
<script src="//www.google.com/js/gweb/analytics/autotrack.js">
|
||||
</script>
|
||||
<script>
|
||||
new gweb.analytics.AutoTrack({
|
||||
profile: 'UA-26908291-1'
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body class="" id="grid">
|
||||
<div class="browser-eula" id="main">
|
||||
<div class="compact">
|
||||
<h2>
|
||||
Google Chrome Terms of Service
|
||||
</h2>
|
||||
<p>
|
||||
These Terms of Service apply to the executable code version of Google Chrome. Source code
|
||||
for Google Chrome is available free of charge under open source software license
|
||||
agreements at http://code.google.com/chromium/terms.html.
|
||||
</p>
|
||||
<p>
|
||||
<strong>1. Your relationship with Google</strong>
|
||||
</p>
|
||||
<p>
|
||||
1.1 Your use of Google’s products, software, services and web sites (referred to
|
||||
collectively as the “Services” in this document and excluding any services provided to
|
||||
you by Google under a separate written agreement) is subject to the terms of a legal
|
||||
agreement between you and Google. “Google” means Google Inc., whose principal place of
|
||||
business is at 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States. This
|
||||
document explains how the agreement is made up, and sets out some of the terms of that
|
||||
agreement.
|
||||
</p>
|
||||
<p>
|
||||
1.2 Unless otherwise agreed in writing with Google, your agreement with Google will
|
||||
always include, at a minimum, the terms and conditions set out in this document. These
|
||||
are referred to below as the “Universal Terms”. Open source software licenses for Google
|
||||
Chrome source code constitute separate written agreements. To the limited extent that the
|
||||
open source software licenses expressly supersede these Universal Terms, the open source
|
||||
licenses govern your agreement with Google for the use of Google Chrome or specific
|
||||
included components of Google Chrome.
|
||||
</p>
|
||||
<p>
|
||||
1.3 Your agreement with Google will also include the terms set forth below in the Google
|
||||
Chrome Additional Terms of Service and terms of any Legal Notices applicable to the
|
||||
Services, in addition to the Universal Terms. All of these are referred to below as the
|
||||
“Additional Terms”. Where Additional Terms apply to a Service, these will be accessible
|
||||
for you to read either within, or through your use of, that Service.
|
||||
</p>
|
||||
<p>
|
||||
1.4 The Universal Terms, together with the Additional Terms, form a legally binding
|
||||
agreement between you and Google in relation to your use of the Services. It is important
|
||||
that you take the time to read them carefully. Collectively, this legal agreement is
|
||||
referred to below as the “Terms”.
|
||||
</p>
|
||||
<p>
|
||||
1.5 If there is any contradiction between what the Additional Terms say and what the
|
||||
Universal Terms say, then the Additional Terms shall take precedence in relation to that
|
||||
Service.
|
||||
</p>
|
||||
<p>
|
||||
<strong>2. Accepting the Terms</strong>
|
||||
</p>
|
||||
<p>
|
||||
2.1 In order to use the Services, you must first agree to the Terms. You may not use the
|
||||
Services if you do not accept the Terms.
|
||||
</p>
|
||||
<p>
|
||||
2.2 You can accept the Terms by:
|
||||
</p>
|
||||
<p>
|
||||
(A) clicking to accept or agree to the Terms, where this option is made available to you
|
||||
by Google in the user interface for any Service; or
|
||||
</p>
|
||||
<p>
|
||||
(B) by actually using the Services. In this case, you understand and agree that Google
|
||||
will treat your use of the Services as acceptance of the Terms from that point onwards.
|
||||
</p>
|
||||
<p>
|
||||
<strong>3. Language of the Terms</strong>
|
||||
</p>
|
||||
<p>
|
||||
3.1 Where Google has provided you with a translation of the English language version of
|
||||
the Terms, then you agree that the translation is provided for your convenience only and
|
||||
that the English language versions of the Terms will govern your relationship with
|
||||
Google.
|
||||
</p>
|
||||
<p>
|
||||
3.2 If there is any contradiction between what the English language version of the Terms
|
||||
says and what a translation says, then the English language version shall take
|
||||
precedence.
|
||||
</p>
|
||||
<p>
|
||||
<strong>4. Provision of the Services by Google</strong>
|
||||
</p>
|
||||
<p>
|
||||
4.1 Google has subsidiaries and affiliated legal entities around the world (“Subsidiaries
|
||||
and Affiliates”). Sometimes, these companies will be providing the Services to you on
|
||||
behalf of Google itself. You acknowledge and agree that Subsidiaries and Affiliates will
|
||||
be entitled to provide the Services to you.
|
||||
</p>
|
||||
<p>
|
||||
4.2 Google is constantly innovating in order to provide the best possible experience for
|
||||
its users. You acknowledge and agree that the form and nature of the Services which
|
||||
Google provides may change from time to time without prior notice to you.
|
||||
</p>
|
||||
<p>
|
||||
4.3 As part of this continuing innovation, you acknowledge and agree that Google may stop
|
||||
(permanently or temporarily) providing the Services (or any features within the Services)
|
||||
to you or to users generally at Google’s sole discretion, without prior notice to you.
|
||||
You may stop using the Services at any time. You do not need to specifically inform
|
||||
Google when you stop using the Services.
|
||||
</p>
|
||||
<p>
|
||||
4.4 You acknowledge and agree that if Google disables access to your account, you may be
|
||||
prevented from accessing the Services, your account details or any files or other content
|
||||
which is contained in your account.
|
||||
</p>
|
||||
<p>
|
||||
<strong>5. Use of the Services by you</strong>
|
||||
</p>
|
||||
<p>
|
||||
5.1 You agree to use the Services only for purposes that are permitted by (a) the Terms
|
||||
and (b) any applicable law, regulation or generally accepted practices or guidelines in
|
||||
the relevant jurisdictions (including any laws regarding the export of data or software
|
||||
to and from the United States or other relevant countries).
|
||||
</p>
|
||||
<p>
|
||||
5.2 You agree that you will not engage in any activity that interferes with or disrupts
|
||||
the Services (or the servers and networks which are connected to the Services).
|
||||
</p>
|
||||
<p>
|
||||
5.3 Unless you have been specifically permitted to do so in a separate agreement with
|
||||
Google, you agree that you will not reproduce, duplicate, copy, sell, trade or resell the
|
||||
Services for any purpose.
|
||||
</p>
|
||||
<p>
|
||||
5.4 You agree that you are solely responsible for (and that Google has no responsibility
|
||||
to you or to any third party for) any breach of your obligations under the Terms and for
|
||||
the consequences (including any loss or damage which Google may suffer) of any such
|
||||
breach.
|
||||
</p>
|
||||
<p>
|
||||
<strong>6. Privacy and your personal information</strong>
|
||||
</p>
|
||||
<p>
|
||||
6.1 For information about Google’s data protection practices, please read Google’s
|
||||
privacy policy at http://www.google.com/privacy.html and at
|
||||
http://www.google.com/chrome/intl/en/privacy.html. This policy explains how Google treats
|
||||
your personal information, and protects your privacy, when you use the Services.
|
||||
</p>
|
||||
<p>
|
||||
6.2 You agree to the use of your data in accordance with Google’s privacy policies.
|
||||
</p>
|
||||
<p>
|
||||
<strong>7. Content in the Services</strong>
|
||||
</p>
|
||||
<p>
|
||||
7.1 You understand that all information (such as data files, written text, computer
|
||||
software, music, audio files or other sounds, photographs, videos or other images) which
|
||||
you may have access to as part of, or through your use of, the Services are the sole
|
||||
responsibility of the person from which such content originated. All such information is
|
||||
referred to below as the “Content.”
|
||||
</p>
|
||||
<p>
|
||||
7.2 You should be aware that Content presented to you as part of the Services, including
|
||||
but not limited to advertisements in the Services and sponsored Content within the
|
||||
Services may be protected by intellectual property rights which are owned by the sponsors
|
||||
or advertisers who provide that Content to Google (or by other persons or companies on
|
||||
their behalf). You may not modify, rent, lease, loan, sell, distribute or create
|
||||
derivative works based on this Content (either in whole or in part) unless you have been
|
||||
specifically told that you may do so by Google or by the owners of that Content, in a
|
||||
separate agreement.
|
||||
</p>
|
||||
<p>
|
||||
7.3 Google reserves the right (but shall have no obligation) to pre-screen, review, flag,
|
||||
filter, modify, refuse or remove any or all Content from any Service. For some of the
|
||||
Services, Google may provide tools to filter out explicit sexual content. These tools
|
||||
include the SafeSearch preference settings (see
|
||||
https://support.google.com/websearch/answer/510?hl=en). In addition, there are
|
||||
commercially available services and software to limit access to material that you may
|
||||
find objectionable.
|
||||
</p>
|
||||
<p>
|
||||
7.4 You understand that by using the Services you may be exposed to Content that you may
|
||||
find offensive, indecent or objectionable and that, in this respect, you use the Services
|
||||
at your own risk.
|
||||
</p>
|
||||
<p>
|
||||
7.5 You agree that you are solely responsible for (and that Google has no responsibility
|
||||
to you or to any third party for) any Content that you create, transmit or display while
|
||||
using the Services and for the consequences of your actions (including any loss or damage
|
||||
which Google may suffer) by doing so.
|
||||
</p>
|
||||
<p>
|
||||
<strong>8. Proprietary rights</strong>
|
||||
</p>
|
||||
<p>
|
||||
8.1 You acknowledge and agree that Google (or Google’s licensors) own all legal right,
|
||||
title and interest in and to the Services, including any intellectual property rights
|
||||
which subsist in the Services (whether those rights happen to be registered or not, and
|
||||
wherever in the world those rights may exist).
|
||||
</p>
|
||||
<p>
|
||||
8.2 Unless you have agreed otherwise in writing with Google, nothing in the Terms gives
|
||||
you a right to use any of Google’s trade names, trade marks, service marks, logos, domain
|
||||
names, and other distinctive brand features.
|
||||
</p>
|
||||
<p>
|
||||
8.3 If you have been given an explicit right to use any of these brand features in a
|
||||
separate written agreement with Google, then you agree that your use of such features
|
||||
shall be in compliance with that agreement, any applicable provisions of the Terms, and
|
||||
Google's brand feature use guidelines as updated from time to time. These guidelines can
|
||||
be viewed online at http://www.google.com/permissions/guidelines.html (or such other URL
|
||||
as Google may provide for this purpose from time to time).
|
||||
</p>
|
||||
<p>
|
||||
8.4 Google acknowledges and agrees that it obtains no right, title or interest from you
|
||||
(or your licensors) under these Terms in or to any Content that you submit, post,
|
||||
transmit or display on, or through, the Services, including any intellectual property
|
||||
rights which subsist in that Content (whether those rights happen to be registered or
|
||||
not, and wherever in the world those rights may exist). Unless you have agreed otherwise
|
||||
in writing with Google, you agree that you are responsible for protecting and enforcing
|
||||
those rights and that Google has no obligation to do so on your behalf.
|
||||
</p>
|
||||
<p>
|
||||
8.5 You agree that you shall not remove, obscure, or alter any proprietary rights notices
|
||||
(including copyright and trade mark notices) which may be affixed to or contained within
|
||||
the Services.
|
||||
</p>
|
||||
<p>
|
||||
8.6 Unless you have been expressly authorized to do so in writing by Google, you agree
|
||||
that in using the Services, you will not use any trade mark, service mark, trade name,
|
||||
logo of any company or organization in a way that is likely or intended to cause
|
||||
confusion about the owner or authorized user of such marks, names or logos.
|
||||
</p>
|
||||
<p>
|
||||
<strong>9. License from Google</strong>
|
||||
</p>
|
||||
<p>
|
||||
9.1 Google gives you a personal, worldwide, royalty-free, non-assignable and
|
||||
non-exclusive license to use the software provided to you by Google as part of the
|
||||
Services as provided to you by Google (referred to as the “Software” below). This license
|
||||
is for the sole purpose of enabling you to use and enjoy the benefit of the Services as
|
||||
provided by Google, in the manner permitted by the Terms.
|
||||
</p>
|
||||
<p>
|
||||
9.2 Subject to section 1.2, you may not (and you may not permit anyone else to) copy,
|
||||
modify, create a derivative work of, reverse engineer, decompile or otherwise attempt to
|
||||
extract the source code of the Software or any part thereof, unless this is expressly
|
||||
permitted or required by law, or unless you have been specifically told that you may do
|
||||
so by Google, in writing.
|
||||
</p>
|
||||
<p>
|
||||
9.3 Subject to section 1.2, unless Google has given you specific written permission to do
|
||||
so, you may not assign (or grant a sub-license of) your rights to use the Software, grant
|
||||
a security interest in or over your rights to use the Software, or otherwise transfer any
|
||||
part of your rights to use the Software.
|
||||
</p>
|
||||
<p>
|
||||
<strong>10. Content license from you</strong>
|
||||
</p>
|
||||
<p>
|
||||
10.1 You retain copyright and any other rights you already hold in Content which you
|
||||
submit, post or display on or through, the Services.
|
||||
</p>
|
||||
<p>
|
||||
<strong>11. Software updates</strong>
|
||||
</p>
|
||||
<p>
|
||||
11.1 The Software which you use may automatically download and install updates from time
|
||||
to time from Google. These updates are designed to improve, enhance and further develop
|
||||
the Services and may take the form of bug fixes, enhanced functions, new software modules
|
||||
and completely new versions. You agree to receive such updates (and permit Google to
|
||||
deliver these to you) as part of your use of the Services.
|
||||
</p>
|
||||
<p>
|
||||
<strong>12. Ending your relationship with Google</strong>
|
||||
</p>
|
||||
<p>
|
||||
12.1 The Terms will continue to apply until terminated by either you or Google as set out
|
||||
below.
|
||||
</p>
|
||||
<p>
|
||||
12.2 Google may at any time, terminate its legal agreement with you if:
|
||||
</p>
|
||||
<p>
|
||||
(A) you have breached any provision of the Terms (or have acted in manner which clearly
|
||||
shows that you do not intend to, or are unable to comply with the provisions of the
|
||||
Terms); or
|
||||
</p>
|
||||
<p>
|
||||
(B) Google is required to do so by law (for example, where the provision of the Services
|
||||
to you is, or becomes, unlawful); or
|
||||
</p>
|
||||
<p>
|
||||
(C) the partner with whom Google offered the Services to you has terminated its
|
||||
relationship with Google or ceased to offer the Services to you; or
|
||||
</p>
|
||||
<p>
|
||||
(D) Google is transitioning to no longer providing the Services to users in the country
|
||||
in which you are resident or from which you use the service; or
|
||||
</p>
|
||||
<p>
|
||||
(E) the provision of the Services to you by Google is, in Google’s opinion, no longer
|
||||
commercially viable.
|
||||
</p>
|
||||
<p>
|
||||
12.3 Nothing in this Section shall affect Google’s rights regarding provision of Services
|
||||
under Section 4 of the Terms.
|
||||
</p>
|
||||
<p>
|
||||
12.4 When these Terms come to an end, all of the legal rights, obligations and
|
||||
liabilities that you and Google have benefited from, been subject to (or which have
|
||||
accrued over time whilst the Terms have been in force) or which are expressed to continue
|
||||
indefinitely, shall be unaffected by this cessation, and the provisions of paragraph 19.7
|
||||
shall continue to apply to such rights, obligations and liabilities indefinitely.
|
||||
</p>
|
||||
<p>
|
||||
<strong>13. EXCLUSION OF WARRANTIES</strong>
|
||||
</p>
|
||||
<p>
|
||||
13.1 NOTHING IN THESE TERMS, INCLUDING SECTIONS 13 AND 14, SHALL EXCLUDE OR LIMIT
|
||||
GOOGLE’S WARRANTY OR LIABILITY FOR LOSSES WHICH MAY NOT BE LAWFULLY EXCLUDED OR LIMITED
|
||||
BY APPLICABLE LAW. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF CERTAIN WARRANTIES OR
|
||||
CONDITIONS OR THE LIMITATION OR EXCLUSION OF LIABILITY FOR LOSS OR DAMAGE CAUSED BY
|
||||
NEGLIGENCE, BREACH OF CONTRACT OR BREACH OF IMPLIED TERMS, OR INCIDENTAL OR CONSEQUENTIAL
|
||||
DAMAGES. ACCORDINGLY, ONLY THE LIMITATIONS WHICH ARE LAWFUL IN YOUR JURISDICTION WILL
|
||||
APPLY TO YOU AND OUR LIABILITY WILL BE LIMITED TO THE MAXIMUM EXTENT PERMITTED BY LAW.
|
||||
</p>
|
||||
<p>
|
||||
13.2 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE SERVICES IS AT YOUR SOLE
|
||||
RISK AND THAT THE SERVICES ARE PROVIDED "AS IS" AND “AS AVAILABLE.”
|
||||
</p>
|
||||
<p>
|
||||
13.3 IN PARTICULAR, GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS DO NOT
|
||||
REPRESENT OR WARRANT TO YOU THAT:
|
||||
</p>
|
||||
<p>
|
||||
(A) YOUR USE OF THE SERVICES WILL MEET YOUR REQUIREMENTS,
|
||||
</p>
|
||||
<p>
|
||||
(B) YOUR USE OF THE SERVICES WILL BE UNINTERRUPTED, TIMELY, SECURE OR FREE FROM ERROR,
|
||||
</p>
|
||||
<p>
|
||||
(C) ANY INFORMATION OBTAINED BY YOU AS A RESULT OF YOUR USE OF THE SERVICES WILL BE
|
||||
ACCURATE OR RELIABLE, AND
|
||||
</p>
|
||||
<p>
|
||||
(D) THAT DEFECTS IN THE OPERATION OR FUNCTIONALITY OF ANY SOFTWARE PROVIDED TO YOU AS
|
||||
PART OF THE SERVICES WILL BE CORRECTED.
|
||||
</p>
|
||||
<p>
|
||||
13.4 ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE SERVICES IS
|
||||
DONE AT YOUR OWN DISCRETION AND RISK AND THAT YOU WILL BE SOLELY RESPONSIBLE FOR ANY
|
||||
DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM THE
|
||||
DOWNLOAD OF ANY SUCH MATERIAL.
|
||||
</p>
|
||||
<p>
|
||||
13.5 NO ADVICE OR INFORMATION, WHETHER ORAL OR WRITTEN, OBTAINED BY YOU FROM GOOGLE OR
|
||||
THROUGH OR FROM THE SERVICES SHALL CREATE ANY WARRANTY NOT EXPRESSLY STATED IN THE TERMS.
|
||||
</p>
|
||||
<p>
|
||||
13.6 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND,
|
||||
WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND
|
||||
CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
|
||||
</p>
|
||||
<p>
|
||||
<strong>14. LIMITATION OF LIABILITY</strong>
|
||||
</p>
|
||||
<p>
|
||||
14.1 SUBJECT TO OVERALL PROVISION IN PARAGRAPH 13.1 ABOVE, YOU EXPRESSLY UNDERSTAND AND
|
||||
AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||
TO YOU FOR:
|
||||
</p>
|
||||
<p>
|
||||
(A) ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL CONSEQUENTIAL OR EXEMPLARY DAMAGES WHICH
|
||||
MAY BE INCURRED BY YOU, HOWEVER CAUSED AND UNDER ANY THEORY OF LIABILITY.. THIS SHALL
|
||||
INCLUDE, BUT NOT BE LIMITED TO, ANY LOSS OF PROFIT (WHETHER INCURRED DIRECTLY OR
|
||||
INDIRECTLY), ANY LOSS OF GOODWILL OR BUSINESS REPUTATION, ANY LOSS OF DATA SUFFERED, COST
|
||||
OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR OTHER INTANGIBLE LOSS;
|
||||
</p>
|
||||
<p>
|
||||
(B) ANY LOSS OR DAMAGE WHICH MAY BE INCURRED BY YOU, INCLUDING BUT NOT LIMITED TO LOSS OR
|
||||
DAMAGE AS A RESULT OF:
|
||||
</p>
|
||||
<p>
|
||||
(I) ANY RELIANCE PLACED BY YOU ON THE COMPLETENESS, ACCURACY OR EXISTENCE OF ANY
|
||||
ADVERTISING, OR AS A RESULT OF ANY RELATIONSHIP OR TRANSACTION BETWEEN YOU AND ANY
|
||||
ADVERTISER OR SPONSOR WHOSE ADVERTISING APPEARS ON THE SERVICES;
|
||||
</p>
|
||||
<p>
|
||||
(II) ANY CHANGES WHICH GOOGLE MAY MAKE TO THE SERVICES, OR FOR ANY PERMANENT OR TEMPORARY
|
||||
CESSATION IN THE PROVISION OF THE SERVICES (OR ANY FEATURES WITHIN THE SERVICES);
|
||||
</p>
|
||||
<p>
|
||||
(III) THE DELETION OF, CORRUPTION OF, OR FAILURE TO STORE, ANY CONTENT AND OTHER
|
||||
COMMUNICATIONS DATA MAINTAINED OR TRANSMITTED BY OR THROUGH YOUR USE OF THE SERVICES;
|
||||
</p>
|
||||
<p>
|
||||
(IV) YOUR FAILURE TO PROVIDE GOOGLE WITH ACCURATE ACCOUNT INFORMATION;
|
||||
</p>
|
||||
<p>
|
||||
(V) YOUR FAILURE TO KEEP YOUR PASSWORD OR ACCOUNT DETAILS SECURE AND CONFIDENTIAL;
|
||||
</p>
|
||||
<p>
|
||||
14.2 THE LIMITATIONS ON GOOGLE’S LIABILITY TO YOU IN PARAGRAPH 14.1 ABOVE SHALL APPLY
|
||||
WHETHER OR NOT GOOGLE HAS BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF
|
||||
ANY SUCH LOSSES ARISING.
|
||||
</p>
|
||||
<p>
|
||||
<strong>15. Copyright and trade mark policies</strong>
|
||||
</p>
|
||||
<p>
|
||||
15.1 It is Google’s policy to respond to notices of alleged copyright infringement that
|
||||
comply with applicable international intellectual property law (including, in the United
|
||||
States, the Digital Millennium Copyright Act) and to terminating the accounts of repeat
|
||||
infringers. Details of Google’s policy can be found at http://www.google.com/dmca.html.
|
||||
</p>
|
||||
<p>
|
||||
15.2 Google operates a trade mark complaints procedure in respect of Google’s advertising
|
||||
business, details of which can be found at http://www.google.com/tm_complaint.html.
|
||||
</p>
|
||||
<p>
|
||||
<strong>16. Advertisements</strong>
|
||||
</p>
|
||||
<p>
|
||||
16.1 Some of the Services are supported by advertising revenue and may display
|
||||
advertisements and promotions. These advertisements may be targeted to the content of
|
||||
information stored on the Services, queries made through the Services or other
|
||||
information.
|
||||
</p>
|
||||
<p>
|
||||
16.2 The manner, mode and extent of advertising by Google on the Services are subject to
|
||||
change without specific notice to you.
|
||||
</p>
|
||||
<p>
|
||||
16.3 In consideration for Google granting you access to and use of the Services, you
|
||||
agree that Google may place such advertising on the Services.
|
||||
</p>
|
||||
<p>
|
||||
<strong>17. Other content</strong>
|
||||
</p>
|
||||
<p>
|
||||
17.1 The Services may include hyperlinks to other web sites or content or resources.
|
||||
Google may have no control over any web sites or resources which are provided by
|
||||
companies or persons other than Google.
|
||||
</p>
|
||||
<p>
|
||||
17.2 You acknowledge and agree that Google is not responsible for the availability of any
|
||||
such external sites or resources, and does not endorse any advertising, products or other
|
||||
materials on or available from such web sites or resources.
|
||||
</p>
|
||||
<p>
|
||||
17.3 You acknowledge and agree that Google is not liable for any loss or damage which may
|
||||
be incurred by you as a result of the availability of those external sites or resources,
|
||||
or as a result of any reliance placed by you on the completeness, accuracy or existence
|
||||
of any advertising, products or other materials on, or available from, such web sites or
|
||||
resources.
|
||||
</p>
|
||||
<p>
|
||||
<strong>18. Changes to the Terms</strong>
|
||||
</p>
|
||||
<p>
|
||||
18.1 Google may make changes to the Universal Terms or Additional Terms from time to
|
||||
time. When these changes are made, Google will make a new copy of the Universal Terms
|
||||
available at http://www.google.com/chrome/intl/en/eula_text.html and any new Additional
|
||||
Terms will be made available to you from within, or through, the affected Services.
|
||||
</p>
|
||||
<p>
|
||||
18.2 You understand and agree that if you use the Services after the date on which the
|
||||
Universal Terms or Additional Terms have changed, Google will treat your use as
|
||||
acceptance of the updated Universal Terms or Additional Terms.
|
||||
</p>
|
||||
<p>
|
||||
<strong>19. General legal terms</strong>
|
||||
</p>
|
||||
<p>
|
||||
19.1 Sometimes when you use the Services, you may (as a result of, or in connection with
|
||||
your use of the Services) use a service or download a piece of software, or purchase
|
||||
goods, which are provided by another person or company. Your use of these other services,
|
||||
software or goods may be subject to separate terms between you and the company or person
|
||||
concerned. If so, the Terms do not affect your legal relationship with these other
|
||||
companies or individuals.
|
||||
</p>
|
||||
<p>
|
||||
19.2 The Terms constitute the whole legal agreement between you and Google and govern
|
||||
your use of the Services (but excluding any services which Google may provide to you
|
||||
under a separate written agreement), and completely replace any prior agreements between
|
||||
you and Google in relation to the Services.
|
||||
</p>
|
||||
<p>
|
||||
19.3 You agree that Google may provide you with notices, including those regarding
|
||||
changes to the Terms, by email, regular mail, or postings on the Services.
|
||||
</p>
|
||||
<p>
|
||||
19.4 You agree that if Google does not exercise or enforce any legal right or remedy
|
||||
which is contained in the Terms (or which Google has the benefit of under any applicable
|
||||
law), this will not be taken to be a formal waiver of Google’s rights and that those
|
||||
rights or remedies will still be available to Google.
|
||||
</p>
|
||||
<p>
|
||||
19.5 If any court of law, having the jurisdiction to decide on this matter, rules that
|
||||
any provision of these Terms is invalid, then that provision will be removed from the
|
||||
Terms without affecting the rest of the Terms. The remaining provisions of the Terms will
|
||||
continue to be valid and enforceable.
|
||||
</p>
|
||||
<p>
|
||||
19.6 You acknowledge and agree that each member of the group of companies of which Google
|
||||
is the parent shall be third party beneficiaries to the Terms and that such other
|
||||
companies shall be entitled to directly enforce, and rely upon, any provision of the
|
||||
Terms which confers a benefit on (or rights in favor of) them. Other than this, no other
|
||||
person or company shall be third party beneficiaries to the Terms.
|
||||
</p>
|
||||
<p>
|
||||
19.7 The Terms, and your relationship with Google under the Terms, shall be governed by
|
||||
the laws of the State of California without regard to its conflict of laws provisions.
|
||||
You and Google agree to submit to the exclusive jurisdiction of the courts located within
|
||||
the county of Santa Clara, California to resolve any legal matter arising from the Terms.
|
||||
Notwithstanding this, you agree that Google shall still be allowed to apply for
|
||||
injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction.
|
||||
</p>
|
||||
<p>
|
||||
<strong>20. Additional Terms for Extensions for Google Chrome</strong>
|
||||
</p>
|
||||
<p>
|
||||
20.1 These terms in this section apply if you install extensions on your copy of Google
|
||||
Chrome. Extensions are small software programs, developed by Google or third parties,
|
||||
that can modify and enhance the functionality of Google Chrome. Extensions may have
|
||||
greater privileges to access your browser or your computer than regular webpages,
|
||||
including the ability to read and modify your private data.
|
||||
</p>
|
||||
<p>
|
||||
20.2 From time to time, Google Chrome may check with remote servers (hosted by Google or
|
||||
by third parties) for available updates to extensions, including but not limited to bug
|
||||
fixes or enhanced functionality. You agree that such updates will be automatically
|
||||
requested, downloaded, and installed without further notice to you.
|
||||
</p>
|
||||
<p>
|
||||
20.3 From time to time, Google may discover an extension that violates Google developer
|
||||
terms or other legal agreements, laws, regulations or policies. Google Chrome will
|
||||
periodically download a list of such extensions from Google’s servers. You agree that
|
||||
Google may remotely disable or remove any such extension from user systems in its sole
|
||||
discretion.
|
||||
</p>
|
||||
<p>
|
||||
<strong>21. Additional Terms for Enterprise Use</strong>
|
||||
</p>
|
||||
<p>
|
||||
21.1 If you are a business entity, then the individual accepting on behalf of the entity
|
||||
(for the avoidance of doubt, for business entities, in these Terms, "you" means the
|
||||
entity) represents and warrants that he or she has the authority to act on your behalf,
|
||||
that you represent that you are duly authorized to do business in the country or
|
||||
countries where you operate, and that your employees, officers, representatives, and
|
||||
other agents accessing the Service are duly authorized to access Google Chrome and to
|
||||
legally bind you to these Terms.
|
||||
</p>
|
||||
<p>
|
||||
21.2 Subject to the Terms, and in addition to the license grant in Section 9, Google
|
||||
grants you a non-exclusive, non-transferable license to reproduce, distribute, install,
|
||||
and use Google Chrome solely on machines intended for use by your employees, officers,
|
||||
representatives, and agents in connection with your business entity, and provided that
|
||||
their use of Google Chrome will be subject to the Terms.
|
||||
</p>
|
||||
<p>
|
||||
August 12, 2010
|
||||
</p><br>
|
||||
<hr>
|
||||
<br>
|
||||
<h2>
|
||||
Google Chrome Additional Terms of Service
|
||||
</h2>
|
||||
<p>
|
||||
<strong>MPEGLA</strong>
|
||||
</p>
|
||||
<p>
|
||||
THIS PRODUCT IS LICENSED UNDER THE AVC PATENT PORTFOLIO LICENSE FOR THE PERSONAL AND
|
||||
NON-COMMERCIAL USE OF A CONSUMER TO (i) ENCODE VIDEO IN COMPLIANCE WITH THE AVC STANDARD
|
||||
( “AVC VIDEO”) AND/OR (ii) DECODE AVC VIDEO THAT WAS ENCODED BY A CONSUMER ENGAGED IN A
|
||||
PERSONAL AND NON-COMMERCIAL ACTIVITY AND/OR WAS OBTAINED FROM A VIDEO PARTNER LICENSED TO
|
||||
PROVIDE AVC VIDEO. NO LICENSE IS GRANTED OR SHALL BE IMPLIED FOR ANY OTHER USE.
|
||||
ADDITIONAL INFORMATION MAY BE OBTAINED FROM MPEG LA, L.L.C. SEE HTTP://WWW.MPEGLA.COM.
|
||||
</p>
|
||||
<p>
|
||||
<strong>Adobe</strong>
|
||||
</p>
|
||||
<p>
|
||||
Google Chrome may include one or more components provided by Adobe Systems Incorporated
|
||||
and Adobe Software Ireland Limited (collectively “Adobe”). Your use of the Adobe software
|
||||
as provided by Google (“Adobe Software”) is subject to the following additional terms
|
||||
(the “Adobe Terms”). You, the entity receiving the Adobe Software, will be hereinafter
|
||||
referred to as “Sublicensee.”
|
||||
</p>
|
||||
<p>
|
||||
1. License Restrictions.
|
||||
</p>
|
||||
<p>
|
||||
(a) Flash Player, Version 10.x is designed only as a browser plug-in. Sublicensee may not
|
||||
modify or distribute this Adobe Software for use as anything but a browser plug-in for
|
||||
playing back content on a web page. For example, Sublicensee will not modify this Adobe
|
||||
Software in order to allow interoperation with applications that run outside of the
|
||||
browser (e.g., standalone applications, widgets, device UI).
|
||||
</p>
|
||||
<p>
|
||||
(b) Sublicensee will not expose any APIs of the Flash Player, Version 10.x through a
|
||||
browser plug-in interface in such a way that allows such extension to be used to playback
|
||||
content from a web page as a stand-alone application.
|
||||
</p>
|
||||
<p>
|
||||
(c) The Chrome-Reader Software may not be used to render any PDF or EPUB documents that
|
||||
utilize digital rights management protocols or systems other than Adobe DRM.
|
||||
</p>
|
||||
<p>
|
||||
(d) Adobe DRM must be enabled in the Chrome-Reader Software for all Adobe DRM protected
|
||||
PDF and EPUB documents.
|
||||
</p>
|
||||
<p>
|
||||
(e) The Chrome-Reader Software may not, other than as explicitly permitted by the
|
||||
technical specifications, disable any capabilities provided by Adobe in the Adobe
|
||||
Software, including but not limited to, support for PDF and EPUB formats and Adobe DRM.
|
||||
</p>
|
||||
<p>
|
||||
2. Electronic Transmission. Sublicensee may allow the download of the Adobe Software from
|
||||
a web site, the Internet, an intranet, or similar technology (an, “Electronic
|
||||
Transmissions”) provided that Sublicensee agrees that any distributions of the Adobe
|
||||
Software by Sublicensee, including those on CD-ROM, DVD-ROM or other storage media and
|
||||
Electronic Transmissions, if expressly permitted, shall be subject to reasonable security
|
||||
measures to prevent unauthorized use. With relation to Electronic Transmissions approved
|
||||
hereunder, Sublicensee agrees to employ any reasonable use restrictions set by Adobe,
|
||||
including those related to security and/or the restriction of distribution to end users
|
||||
of the Sublicensee Product.
|
||||
</p>
|
||||
<p>
|
||||
3. EULA and Distribution Terms.
|
||||
</p>
|
||||
<p>
|
||||
(a) Sublicensee shall ensure that the Adobe Software is distributed to end users under an
|
||||
enforceable end user license agreement, in favor of Sublicensee and its suppliers
|
||||
containing at least each of the following minimum terms (the “End-User License”): (i) a
|
||||
prohibition against distribution and copying, (ii) a prohibition against modifications
|
||||
and derivative works, (iii) a prohibition against decompiling, reverse engineering,
|
||||
disassembling, and otherwise reducing the Adobe Software to a human-perceivable form,
|
||||
(iv) a provision indicating ownership of Sublicensee Product (as defined in Section 8) by
|
||||
Sublicensee and its licensors, (v) a disclaimer of indirect, special, incidental,
|
||||
punitive, and consequential damages, and (vi) other industry standard disclaimers and
|
||||
limitations, including, as applicable: a disclaimer of all applicable statutory
|
||||
warranties, to the full extent allowed by law.
|
||||
</p>
|
||||
<p>
|
||||
(b) Sublicensee shall ensure that the Adobe Software is distributed to Sublicensee’s
|
||||
distributors under an enforceable distribution license agreement, in favor of Sublicensee
|
||||
and its suppliers containing terms as protective of Adobe as the Adobe Terms.
|
||||
</p>
|
||||
<p>
|
||||
4. Opensource. Sublicensee will not directly or indirectly grant, or purport to grant, to
|
||||
any third party any rights or immunities under Adobe’s intellectual property or
|
||||
proprietary rights that will subject such intellectual property to an open source license
|
||||
or scheme in which there is or could be interpreted to be a requirement that as a
|
||||
condition of use, modification and/or distribution, the Adobe Software be: (i) disclosed
|
||||
or distributed in source code form; (ii) licensed for the purpose of making derivative
|
||||
works; or (iii) redistributable at no charge. For clarification purposes, the foregoing
|
||||
restriction does not preclude Sublicensee from distributing, and Sublicensee will
|
||||
distribute the Adobe Software as bundled with the Google Software, without charge.
|
||||
</p>
|
||||
<p>
|
||||
5. Additional Terms. With respect to any update, upgrade, new versions of the Adobe
|
||||
Software (collectively “Upgrades”) provided to Sublicenses, Adobe reserves the right to
|
||||
require additional terms and conditions applicable solely to the Upgrade and future
|
||||
versions thereof, and solely to the extent that such restrictions are imposed by Adobe on
|
||||
all licensees of such Upgrade. If Sublicensee does not agree to such additional terms or
|
||||
conditions, Sublicensee will have no license rights with respect to such Upgrade, and
|
||||
Sublicensee’s license rights with respect to the Adobe Software will terminate
|
||||
automatically on the 90th day from the date such additional terms are made available to
|
||||
Sublicensee.
|
||||
</p>
|
||||
<p>
|
||||
6. Proprietary Rights Notices. Sublicensee shall not, and shall require its distributors
|
||||
not to, delete or in any manner alter the copyright notices, trademarks, logos or related
|
||||
notices, or other proprietary rights notices of Adobe (and its licensors, if any)
|
||||
appearing on or within the Adobe Software or accompanying materials.
|
||||
</p>
|
||||
<p>
|
||||
7. Technical Requirements. Sublicensee and its distributors may only distribute Adobe
|
||||
Software and/or Upgrade on devices that (i) meet the technical specifications posted on
|
||||
http://www.adobe.com/mobile/licensees, (or a successor web site thereto), and (ii) has
|
||||
been verified by Adobe as set forth below.
|
||||
</p>
|
||||
<p>
|
||||
8. Verification and Update. Sublicensee must submit to Adobe each Sublicensee product
|
||||
(and each version thereof) containing the Adobe Software and/or Upgrade (“Sublicensee
|
||||
Product”) that do not meet the Device Verification exemption criteria to be communicated
|
||||
by Google, for Adobe to verify. Sublicensee shall pay for each submission made by
|
||||
Sublicensee by procuring verification packages at Adobe’s then-current terms set forth at
|
||||
http://flashmobile.adobe.com/. Sublicensee Product that has not passed verification may
|
||||
not be distributed. Verification will be accomplished in accordance with Adobe’s
|
||||
then-current process described at http://flashmobile.adobe.com/ (“Verification”).
|
||||
</p>
|
||||
<p>
|
||||
9. Profiles and Device Central. Sublicensee will be prompted to enter certain profile
|
||||
information about the Sublicensee Products either as part of the Verification process or
|
||||
some other method, and Sublicensee will provide such information, to Adobe. Adobe may (i)
|
||||
use such profile information as reasonably necessary to verify the Sublicensee Product
|
||||
(if such product is subject to Verification), and (ii) display such profile information
|
||||
in “Adobe Device Intelligence system,” located at
|
||||
https://devices.adobe.com/partnerportal/, and made available through Adobe’s authoring
|
||||
and development tools and services to enable developers and end users to see how content
|
||||
or applications are displayed in Sublicensee Products (e.g. how video images appear in
|
||||
certain phones).
|
||||
</p>
|
||||
<p>
|
||||
10. Export. Sublicensee acknowledges that the laws and regulations of the United States
|
||||
restrict the export and re-export of commodities and technical data of United States
|
||||
origin, which may include the Adobe Software. Sublicensee agrees that it will not export
|
||||
or re-export the Adobe Software, without the appropriate United States and foreign
|
||||
governmental clearances, if any.
|
||||
</p>
|
||||
<p>
|
||||
11. Technology Pass-through Terms.
|
||||
</p>
|
||||
<p>
|
||||
(a) Except pursuant to applicable permissions or agreements therefor, from or with the
|
||||
applicable parties, Sublicensees shall not use and shall not allow the use of, the Adobe
|
||||
Software for the encoding or decoding of mp3 audio only (.mp3) data on any non-pc device
|
||||
(e.g., mobile phone or set-top box), nor may the mp3 encoders or decoders contained in
|
||||
the Adobe Software be used or accessed by any product other than the Adobe Software. The
|
||||
Adobe Software may be used for the encoding or decoding of MP3 data contained within a
|
||||
swf or flv file, which contains video, picture or other data. Sublicensee shall
|
||||
acknowledge that use of the Adobe Software for non-PC devices, as described in the
|
||||
prohibitions in this section, may require the payment of licensing royalties or other
|
||||
amounts to third parties who may hold intellectual property rights related to the MP3
|
||||
technology and that Adobe nor Sublicensee has not paid any royalties or other amounts on
|
||||
account of third party intellectual property rights for such use. If Sublicensee requires
|
||||
an MP3 encoder or decoder for such use, Sublicensee is responsible for obtaining the
|
||||
necessary intellectual property license, including any applicable patent rights.
|
||||
</p>
|
||||
<p>
|
||||
(b) Sublicensee will not use, copy, reproduce and modify (i) the On2 source code
|
||||
(provided hereunder as a component of the Source Code) as necessary to enable the Adobe
|
||||
Software to decode video in the Flash video file format (.flv or .f4v), and (ii) the
|
||||
Sorenson Spark source code (provided hereunder as a component of the Source Code) for the
|
||||
limited purpose of making bug fixes and performance enhancements to the Adobe Software.
|
||||
All codecs provided with the Adobe Software may only be used and distributed as an
|
||||
integrated part of the Adobe Software and may not be accessed by any other application,
|
||||
including other Google applications.
|
||||
</p>
|
||||
<p>
|
||||
(c) The Source Code may be provided with an AAC codec and/or HE-AAC codec (“the AAC
|
||||
Codec”). Use of the AAC Codec is conditioned on Sublicensee obtaining a proper patent
|
||||
license covering necessary patents as provided by VIA Licensing, for end products on or
|
||||
in which the AAC Codec will be used. Sublicensee acknowledges and agrees that Adobe is
|
||||
not providing a patent license for an AAC Codec under this Agreement to Sublicensee or
|
||||
its sublicensees.
|
||||
</p>
|
||||
<p>
|
||||
(d) THE SOURCE CODE MAY CONTAIN CODE LICENSED UNDER THE AVC PATENT PORTFOLIO LICENSE FOR
|
||||
THE PERSONAL NON-COMMERCIAL USE OF A CONSUMER TO (i) ENCODE VIDEO IN COMPLIANCE WITH THE
|
||||
AVC STANDARD ("AVC VIDEO") AND/OR (ii) DECODE AVC VIDEO THAT WAS ENCODED BY A CONSUMER
|
||||
ENGAGED IN A PERSONAL NON-COMMERCIAL ACTIVITY AND/OR WAS OBTAINED FROM A VIDEO PROVIDER
|
||||
LICENSED TO PROVIDE AVC VIDEO. NO LICENSE IS GRANTED OR WILL BE IMPLIED FOR ANY OTHER
|
||||
USE. ADDITIONAL INFORMATION MAY BE OBTAINED FROM MPEG LA, L.L.C. See
|
||||
http://www.mpegla.com
|
||||
</p>
|
||||
<p>
|
||||
12. Update. Sublicensee will not circumvent Google’s or Adobe’s efforts to update the
|
||||
Adobe Software in all Sublicensee’s products incorporating the Adobe Software as bundled
|
||||
with the Google Software (“Sublicensee Products”).
|
||||
</p>
|
||||
<p>
|
||||
13. Attribution and Proprietary Notices. Sublicensee will list the Adobe Software in
|
||||
publicly available Sublicensee Product specifications and include appropriate Adobe
|
||||
Software branding (specifically excluding the Adobe corporate logo) on the Sublicensee
|
||||
Product packaging or marketing materials in a manner consistent with branding of other
|
||||
third party products contained within the Sublicensee Product.
|
||||
</p>
|
||||
<p>
|
||||
14. No Warranty. THE ADOBE SOFTWARE IS MADE AVAILABLE TO SUBLICENSEE FOR USE AND
|
||||
REPRODUCTION “AS IS” AND ADOBE MAKES NO WARRANTY AS TO ITS USE OR PERFORMANCE. ADOBE AND
|
||||
ITS SUPPLIERS DO NOT AND CANNOT WARRANT THE PERFORMANCE OR RESULTS OBTAINED BY USING THE
|
||||
ADOBE SOFTWARE. EXCEPT FOR ANY WARRANTY, CONDITION, REPRESENTATION OR TERM TO THE EXTENT
|
||||
TO WHICH THE SAME CANNOT OR MAY NOT BE EXCLUDED OR LIMITED BY LAW APPLICABLE TO
|
||||
SUBLICENSEEIN SUBLICENSEE’S JURISDICTION, ADOBE AND ITS SUPPLIERS MAKE NO WARRANTIES,
|
||||
CONDITIONS, REPRESENTATIONS, OR TERMS (EXPRESS OR IMPLIED WHETHER BY STATUTE, COMMON LAW,
|
||||
CUSTOM, USAGE OR OTHERWISE) AS TO ANY MATTER INCLUDING WITHOUT LIMITATION NONINFRINGEMENT
|
||||
OF THIRD PARTY RIGHTS, MERCHANTABILITY, INTEGRATION, SATISFACTORY QUALITY, OR FITNESS FOR
|
||||
ANY PARTICULAR PURPOSE. SUBLICENSEE AGREES THAT SUBLICENSEE SHALL NOT MAKE ANY WARRANTY,
|
||||
EXPRESS OR IMPLIED, ON BEHALF OF ADOBE.
|
||||
</p>
|
||||
<p>
|
||||
15. Limitation of Liability. IN NO EVENT WILL ADOBE OR ITS SUPPLIERS BE LIABLE TO
|
||||
SUBLICENSEE FOR ANY DAMAGES, CLAIMS OR COSTS WHATSOEVER OR ANY CONSEQUENTIAL, INDIRECT,
|
||||
OR INCIDENTAL DAMAGES, OR ANY LOST PROFITS OR LOST SAVINGS, EVEN IF AN ADOBE
|
||||
REPRESENTATIVE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH LOSS, DAMAGES, CLAIMS OR COSTS
|
||||
OR FOR ANY CLAIM BY ANY THIRD PARTY. THE FOREGOING LIMITATIONS AND EXCLUSIONS APPLY TO
|
||||
THE EXTENT PERMITTED BY APPLICABLE LAW IN SUBLICENSEE’S JURISDICTION. ADOBE’S AGGREGATE
|
||||
LIABILITY AND THAT OF ITS SUPPLIERS UNDER OR IN CONNECTION WITH THIS AGREEMENT SHALL BE
|
||||
LIMITED TO ONE THOUSAND DOLLARS (US$1,000). Nothing contained in this Agreement limits
|
||||
Adobe’s liability to Sublicensee in the event of death or personal injury resulting from
|
||||
Adobe’s negligence or for the tort of deceit (fraud). Adobe is acting on behalf of its
|
||||
suppliers for the purpose of disclaiming, excluding and/or limiting obligations,
|
||||
warranties and liability as provided in this Agreement, but in no other respects and for
|
||||
no other purpose.
|
||||
</p>
|
||||
<p>
|
||||
16. Content Protection Terms
|
||||
</p>
|
||||
<p>
|
||||
(a) Definitions.
|
||||
</p>
|
||||
<p>
|
||||
“Compliance and Robustness Rules” means the document setting forth compliance and
|
||||
robustness rules for the Adobe Software located at http://www.adobe.com/mobile/licensees,
|
||||
or a successor web site thereto.
|
||||
</p>
|
||||
<p>
|
||||
“Content Protection Functions” means those aspects of the Adobe Software that are
|
||||
designed to ensure compliance with the Compliance and Robustness Rules, and to prevent
|
||||
playback, copying, modification, redistribution or other actions with respect to digital
|
||||
content distributed for consumption by users of the Adobe Software when such actions are
|
||||
not authorized by the owners of such digital content or its licensed distributors.
|
||||
</p>
|
||||
<p>
|
||||
“Content Protection Code” means code within certain designated versions of the Adobe
|
||||
Software that enables certain Content Protection Functions.
|
||||
</p>
|
||||
<p>
|
||||
“Key” means a cryptographic value contained in the Adobe Software for use in decrypting
|
||||
digital content.
|
||||
</p>
|
||||
<p>
|
||||
(b) License Restrictions. Sublicensee’s right to exercise the licenses with respect to
|
||||
the Adobe Software is subject to the following additional restrictions and obligations.
|
||||
Sublicensee will ensure that Sublicensee’s customers comply with these restrictions and
|
||||
obligations to the same extent imposed on Sublicensee with respect to the Adobe Software;
|
||||
any failure by Sublicensee’s customers to comply with these additional restrictions and
|
||||
obligations shall be treated as a material breach by Sublicensee.
|
||||
</p>
|
||||
<p>
|
||||
b.1. Sublicensee and customers may only distribute the Adobe Software that meets the
|
||||
Robustness and Compliance Rules as so confirmed by Sublicensee during the verification
|
||||
process described above in the Adobe Terms.
|
||||
</p>
|
||||
<p>
|
||||
b.2. Sublicensee shall not (i) circumvent the Content Protection Functions of either the
|
||||
Adobe Software or any related Adobe Software that is used to encrypt or decrypt digital
|
||||
content for authorized consumption by users of the Adobe Software, or (ii) develop or
|
||||
distribute products that are designed to circumvent the Content Protection Functions of
|
||||
either the Adobe Software or any Adobe Software that is used to encrypt or decrypt
|
||||
digital content for authorized consumption by users of the Adobe Software.
|
||||
</p>
|
||||
<p>
|
||||
(c) The Keys are hereby designated as Adobe’s Confidential Information, and Sublicensee
|
||||
will, with respect to the Keys, adhere to Adobe’s Source Code Handling Procedure (to be
|
||||
provided by Adobe upon request).
|
||||
</p>
|
||||
<p>
|
||||
(d) Injunctive Relief. Sublicensee agrees that a breach of this Agreement may compromise
|
||||
the Content Protection Functions of the Adobe Software and may cause unique and lasting
|
||||
harm to the interests of Adobe and owners of digital content that rely on such Content
|
||||
Protection Functions, and that monetary damages may be inadequate to compensate fully for
|
||||
such harm. Therefore, Sublicensee further agrees that Adobe may be entitled to seek
|
||||
injunctive relief to prevent or limit the harm caused by any such breach, in addition to
|
||||
monetary damages.
|
||||
</p>
|
||||
<p>
|
||||
17. Intended Third-party Beneficiary. Adobe Systems Incorporated and Adobe Software
|
||||
Ireland Limited are the intended third-party beneficiaries of Google’s agreement with
|
||||
Sublicensee with respect to the Adobe Software, including but not limited to, the Adobe
|
||||
Terms. Sublicensee agrees, notwithstanding anything to the contrary in its agreement with
|
||||
Google, that Google may disclose Sublicensee’s identity to Adobe and certify in writing
|
||||
that Sublicensee has entered into a license agreement with Google which includes the
|
||||
Adobe Terms. Sublicensee must have an agreement with each of its licensees, and if such
|
||||
licensees are allowed to redistribute the Adobe Software, such agreement will include the
|
||||
Adobe Terms.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,11 @@
|
||||
#!/bin/bash
|
||||
|
||||
XDG_CONFIG_HOME=${XDG_CONFIG_HOME:-~/.config}
|
||||
|
||||
# Allow users to override command-line options
|
||||
if [[ -f $XDG_CONFIG_HOME/chrome-flags.conf ]]; then
|
||||
CHROME_USER_FLAGS="$(grep -v '^#' $XDG_CONFIG_HOME/chrome-flags.conf)"
|
||||
fi
|
||||
|
||||
# Launch
|
||||
exec /opt/google/chrome/google-chrome $CHROME_USER_FLAGS "$@"
|
||||
@@ -0,0 +1,14 @@
|
||||
# Colored makepkg-like functions
|
||||
note() {
|
||||
printf "${_blue}==>${_yellow} NOTE:${_bold} %s${_all_off}\n" "$1"
|
||||
}
|
||||
|
||||
_all_off="$(tput sgr0)"
|
||||
_bold="${_all_off}$(tput bold)"
|
||||
_blue="${_bold}$(tput setaf 4)"
|
||||
_yellow="${_bold}$(tput setaf 3)"
|
||||
|
||||
post_install() {
|
||||
note "Custom flags should be put directly in: ~/.config/chrome-flags.conf"
|
||||
note "The launcher is called: 'google-chrome-stable'"
|
||||
}
|
||||
@@ -1,3 +1,12 @@
|
||||
{
|
||||
"source": "local"
|
||||
"source": "local",
|
||||
"upstream": {
|
||||
"git_tags": "https://github.com/omacom/hype.git",
|
||||
"tag_pattern": "v{pkgver}",
|
||||
"sources": {
|
||||
"any": [
|
||||
"https://github.com/omacom/hype/archive/refs/tags/{tag}.tar.gz"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
# Maintainer: David Heinemeier Hansson <david@hey.com>
|
||||
|
||||
pkgname=hype
|
||||
pkgver=0.4.1
|
||||
pkgver=0.4.2
|
||||
pkgrel=1
|
||||
pkgdesc='Simple Markdown presentations with a visual slide editor'
|
||||
arch=('x86_64' 'aarch64')
|
||||
@@ -24,7 +24,7 @@ depends=(
|
||||
)
|
||||
makedepends=('gcc' 'make')
|
||||
source=("$pkgname-$pkgver.tar.gz::$url/archive/refs/tags/v$pkgver.tar.gz")
|
||||
sha256sums=('0724a9d18df7657b50dff21ffe3dec1c107e9191a9e9fd5ad40b56ed9d5d6f51')
|
||||
sha256sums=('eff1a0d8ff04eca8602aeaf0284d1792c0a881f00ecddafe7578ba5ada33cd64')
|
||||
|
||||
build() {
|
||||
cd "$srcdir/$pkgname-$pkgver"
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"source": "local",
|
||||
"sync": false,
|
||||
"release_ring": "fast",
|
||||
"upstream": {
|
||||
"git_tags": "https://github.com/hyprwm/Hyprland.git",
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
pkgname=(hyprland hyprpm)
|
||||
pkgver=0.56.2
|
||||
pkgrel=3
|
||||
pkgrel=4
|
||||
pkgdesc='a highly customizable dynamic tiling Wayland compositor'
|
||||
arch=(aarch64)
|
||||
url="https://github.com/hyprwm/${pkgname^}"
|
||||
@@ -65,12 +65,16 @@ optdepends=('hyprpm: build and install plugins'
|
||||
'xdg-desktop-portal-hyprland: xdg-desktop-portal backend for hyprland')
|
||||
provides=(wayland-compositor)
|
||||
_archive="${pkgname^}-$pkgver"
|
||||
source=("$_archive.tar.gz::$url/releases/download/v$pkgver/source-v$pkgver.tar.gz")
|
||||
sha256sums=('03ad3f5ef152ff44116ffd56fcf808486211ecabf4f0ba567108ee746ba5cd2e')
|
||||
source=("$_archive.tar.gz::$url/releases/download/v$pkgver/source-v$pkgver.tar.gz"
|
||||
software-renderer.patch)
|
||||
sha256sums=('03ad3f5ef152ff44116ffd56fcf808486211ecabf4f0ba567108ee746ba5cd2e'
|
||||
'380bb6d61c36d6c68bcccf242131f5b259734e8570ea39b3bc519b9ed137eddd')
|
||||
|
||||
prepare() {
|
||||
ln -sf hyprland-source "$_archive"
|
||||
cd "$_archive"
|
||||
# Backport of hyprwm/Hyprland#16343; drop once the packaged release includes it
|
||||
patch -Np1 --fuzz=0 -i "$srcdir/software-renderer.patch"
|
||||
sed -i -e '/^release:/{n;s/-D/-DCMAKE_SKIP_RPATH=ON -D/}' Makefile
|
||||
sed -i -e '/find_package.glaze/s/7...<8 //' {.,hyprpm,start}/CMakeLists.txt
|
||||
}
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
# Hyprland software-rendering backport
|
||||
|
||||
Automatic upstream version bumps are held (`sync: false`) while the packaged release carries [Hyprland #16343](https://github.com/hyprwm/Hyprland/pull/16343) as `software-renderer.patch`. `prepare()` applies that patch with `--fuzz=0`. Hyprland's `release_ring: fast` builds edge, rc, and stable from this recipe. Aquamarine changes in the official/ALARM repositories are checked by the separate six-hour `sync-rebuilds` job through `rebuild_on`, which proposes a package release bump for rebuilding.
|
||||
|
||||
The hold does not require staying on v0.56.2 until #16343 lands. If a newer upstream release does not yet include the fix, update `pkgver`, rebase the patch and refresh its checksum, and test software rendering and accelerated rendering before publishing. Keep `sync: false` while the backport is needed.
|
||||
|
||||
Remove `sync: false` and `software-renderer.patch` in the same change once the selected upstream release includes the #16343 behavior. Set `pkgver` to that release, then test software rendering and accelerated rendering before publishing.
|
||||
@@ -0,0 +1,76 @@
|
||||
From: Scott Jones <scottajones@gmail.com>
|
||||
Subject: [PATCH] render: detect software rendering from the GL renderer (0.56.2 backport)
|
||||
|
||||
Backport-of: 61d0ff60a7547d49229714a68b7ca9c0b6658727
|
||||
Backport-of: c3dcabc15ba7b71bd1bcd880e9f543909dd9372d
|
||||
Upstream-PR: https://github.com/hyprwm/Hyprland/pull/16343
|
||||
Co-authored-by: Eryk Wieliczko <44800858+erykwieliczko@users.noreply.github.com>
|
||||
|
||||
Adapt constructor and logger-context differences against v0.56.2 while
|
||||
preserving the GL classification behavior. v0.56.2 has no
|
||||
StringUtils.hpp, so the ASCII case-insensitive matcher lives as a
|
||||
file-local helper in GLRenderer.cpp. Remove this backport once the
|
||||
packaged upstream version includes this behavior.
|
||||
|
||||
--- a/src/render/GLRenderer.cpp
|
||||
+++ b/src/render/GLRenderer.cpp
|
||||
@@ -22,6 +22,7 @@
|
||||
#include "./gl/GLTexture.hpp"
|
||||
|
||||
#include <cstdint>
|
||||
+#include <string_view>
|
||||
#include <hyprutils/memory/SharedPtr.hpp>
|
||||
#include <hyprutils/memory/UniquePtr.hpp>
|
||||
#include <hyprutils/utils/ScopeGuard.hpp>
|
||||
@@ -36,7 +37,30 @@ extern "C" {
|
||||
#include <xf86drm.h>
|
||||
}
|
||||
|
||||
-CHyprGLRenderer::CHyprGLRenderer() : IHyprRenderer(), m_elementRenderer(makeUnique<CGLElementRenderer>()) {}
|
||||
+// Whether haystack contains needle, ignoring ASCII case only; all other bytes must match exactly.
|
||||
+static bool containsCaseInsensitive(const std::string_view haystack, const std::string_view needle) {
|
||||
+ const auto lower = [](const unsigned char c) { return c >= 'A' && c <= 'Z' ? c + ('a' - 'A') : c; };
|
||||
+
|
||||
+ for (size_t i = 0; i + needle.size() <= haystack.size(); ++i) {
|
||||
+ size_t j = 0;
|
||||
+ while (j < needle.size() && lower(haystack[i + j]) == lower(needle[j]))
|
||||
+ ++j;
|
||||
+
|
||||
+ if (j == needle.size())
|
||||
+ return true;
|
||||
+ }
|
||||
+
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
+CHyprGLRenderer::CHyprGLRenderer() : IHyprRenderer(), m_elementRenderer(makeUnique<CGLElementRenderer>()) {
|
||||
+ // KMS can be display-only; classify the active GL renderer instead of the DRM driver.
|
||||
+ g_pHyprOpenGL->makeEGLCurrent();
|
||||
+ if (const auto* renderer = rc<const char*>(glGetString(GL_RENDERER))) {
|
||||
+ const std::string_view name{renderer};
|
||||
+ m_software = containsCaseInsensitive(name, "llvmpipe") || containsCaseInsensitive(name, "softpipe") || containsCaseInsensitive(name, "Software Rasterizer");
|
||||
+ }
|
||||
+}
|
||||
|
||||
IHyprRenderer::eType CHyprGLRenderer::type() {
|
||||
return RT_GL;
|
||||
--- a/src/render/Renderer.cpp
|
||||
+++ b/src/render/Renderer.cpp
|
||||
@@ -104,8 +104,6 @@ IHyprRenderer::IHyprRenderer() {
|
||||
m_nvidia = true;
|
||||
else if (name.contains("i915"))
|
||||
m_intel = true;
|
||||
- else if (name.contains("softpipe") || name.contains("Software Rasterizer") || name.contains("llvmpipe"))
|
||||
- m_software = true;
|
||||
|
||||
Log::logger->log(Log::DEBUG, "DRM driver information: {} v{}.{}.{} from {} description {}", name, DRMV->version_major, DRMV->version_minor, DRMV->version_patchlevel,
|
||||
std::string{DRMV->date, DRMV->date_len}, std::string{DRMV->desc, DRMV->desc_len});
|
||||
@@ -126,8 +124,6 @@ IHyprRenderer::IHyprRenderer() {
|
||||
m_nvidia = true;
|
||||
else if (name.contains("i915"))
|
||||
m_intel = true;
|
||||
- else if (name.contains("softpipe") || name.contains("Software Rasterizer") || name.contains("llvmpipe"))
|
||||
- m_software = true;
|
||||
|
||||
Log::logger->log(Log::DEBUG, "Primary DRM driver information: {} v{}.{}.{} from {} description {}", name, DRMV->version_major, DRMV->version_minor,
|
||||
DRMV->version_patchlevel, std::string{DRMV->date, DRMV->date_len}, std::string{DRMV->desc, DRMV->desc_len});
|
||||
@@ -1,7 +1,7 @@
|
||||
# Maintainer: Dan Wahlin <dwahlin@gmail.com>
|
||||
|
||||
pkgname=learn-omarchy
|
||||
pkgver=0.2.2
|
||||
pkgver=0.2.4
|
||||
pkgrel=1
|
||||
pkgdesc="Interactive, theme-aware courses for learning Omarchy"
|
||||
arch=('any')
|
||||
@@ -25,7 +25,7 @@ optdepends=(
|
||||
)
|
||||
options=('!strip')
|
||||
source=("$pkgname-$pkgver.tar.gz::$url/releases/download/v$pkgver/$pkgname-$pkgver.tar.gz")
|
||||
sha256sums=('67f14778c2b66d56c1504695b0e11cab603f1a002570abc94b4bae9b0bec6066')
|
||||
sha256sums=('34e13cb452dbef9104400cfc468dcee84575e511c11f425b69fd6a9b462599e5')
|
||||
|
||||
package() {
|
||||
cd "$srcdir/$pkgname-$pkgver"
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"source": "local",
|
||||
"upstream": {
|
||||
"watch": {
|
||||
"git_tags": "https://github.com/sofus13/libva-v4l2_request.git",
|
||||
"pattern": "(?P<version>[0-9]+(?:\\.[0-9]+)*)"
|
||||
}
|
||||
},
|
||||
"rebuild_on": [
|
||||
"libva"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
# VA-API driver with Apple Video Decoder fixes from the sofus13 fork.
|
||||
# The asahi alias lets libva discover it on Apple Silicon.
|
||||
|
||||
_fork=sofus13
|
||||
pkgname=libva-v4l2_request-avd
|
||||
pkgver=1.3
|
||||
pkgrel=1
|
||||
pkgdesc='VA-API driver for V4L2 stateless decoders, with Apple Video Decoder (AVD) support'
|
||||
arch=('aarch64')
|
||||
url="https://github.com/$_fork/libva-v4l2_request"
|
||||
license=('GPL-3.0-or-later')
|
||||
# The driver is a dlopen()ed plugin: it links only libc and exports the VA
|
||||
# backend entry point (__vaDriverInit_1_24), so libva is a runtime rather than
|
||||
# a link-time dependency -- and that symbol is versioned, so this needs a
|
||||
# rebuild whenever libva's driver ABI is bumped. libdrm is only used for
|
||||
# drm_fourcc.h constants at compile time.
|
||||
depends=('glibc' 'libva')
|
||||
makedepends=('meson' 'libdrm')
|
||||
provides=('libva-v4l2_request')
|
||||
conflicts=('libva-v4l2_request')
|
||||
install="$pkgname.install"
|
||||
source=("$pkgname-$pkgver.tar.gz::$url/archive/refs/tags/$pkgver.tar.gz")
|
||||
sha256sums=('3670a1712f9f0a5a61bd44a781eba81dd9b2e0fd8271417ca8a9fbbed9dccfe9')
|
||||
|
||||
build() {
|
||||
# driverdir is left unset so meson takes it from libva's pkg-config
|
||||
# (/usr/lib/dri); the codec set is decided by configure-time checks against
|
||||
# the kernel uapi headers, so linux-api-headers governs what gets built in.
|
||||
# Plain meson rather than arch-meson: the latter lives in devtools, which is
|
||||
# not a safe assumption outside a clean chroot. buildtype=plain hands the
|
||||
# compiler makepkg's own CFLAGS/LDFLAGS, which is what arch-meson does too.
|
||||
meson setup \
|
||||
--prefix=/usr \
|
||||
--buildtype=plain \
|
||||
--wrap-mode=nodownload \
|
||||
"libva-v4l2_request-$pkgver" build
|
||||
meson compile -C build
|
||||
}
|
||||
|
||||
package() {
|
||||
meson install -C build --destdir "$pkgdir"
|
||||
|
||||
# libva picks its driver from the DRM driver name of the render node, which
|
||||
# on Apple Silicon is "asahi", so it looks for asahi_drv_video.so. Nothing
|
||||
# else ships that name (mesa provides no VA driver for asahi), so aliasing it
|
||||
# here makes every VA-API application find the decoder with no environment
|
||||
# variable at all. If mesa ever ships its own asahi_drv_video.so this will
|
||||
# collide and pacman will say so at install time.
|
||||
ln -sf v4l2_request_drv_video.so "$pkgdir/usr/lib/dri/asahi_drv_video.so"
|
||||
|
||||
install -Dm644 "libva-v4l2_request-$pkgver/COPYING" \
|
||||
"$pkgdir/usr/share/licenses/$pkgname/COPYING"
|
||||
install -Dm644 "libva-v4l2_request-$pkgver/README" \
|
||||
"$pkgdir/usr/share/doc/$pkgname/README"
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
post_install() {
|
||||
cat <<'MSG'
|
||||
==> This package installs itself as asahi_drv_video.so as well, which is the
|
||||
name libva looks for on Apple Silicon, so VA-API applications should pick
|
||||
the decoder up with no configuration.
|
||||
|
||||
If something does not, select it explicitly for the session:
|
||||
|
||||
LIBVA_DRIVER_NAME=v4l2_request
|
||||
|
||||
==> Check with: vainfo
|
||||
==> mpv: mpv --hwdec=vaapi video.mp4
|
||||
==> Firefox: additionally needs MOZ_DISABLE_RDD_SANDBOX=1, because the RDD
|
||||
sandbox blocks the /dev/video* and /dev/media* access this
|
||||
driver requires. That weakens Firefox's media sandbox.
|
||||
MSG
|
||||
}
|
||||
|
||||
post_upgrade() {
|
||||
post_install
|
||||
}
|
||||
@@ -2,7 +2,7 @@
|
||||
_pkgname="limine-entry-tool"
|
||||
pkgname="limine-mkinitcpio-hook"
|
||||
_gradle_version=9.7.1
|
||||
pkgver=1.39.0
|
||||
pkgver=1.40.0
|
||||
pkgrel=1
|
||||
pkgdesc="Install kernels for the Limine bootloader."
|
||||
arch=('x86_64' 'aarch64')
|
||||
@@ -10,7 +10,9 @@ url="https://gitlab.com/Zesko/limine-entry-tool"
|
||||
source=("${_pkgname}::git+${url}.git#tag=${pkgver}")
|
||||
source_x86_64=("https://github.com/graalvm/graalvm-ce-builds/releases/download/graal-25.2.4/graalvm-community-jdk-25i2-25.0.4_linux-x64_bin.tar.gz")
|
||||
source_aarch64=("https://github.com/graalvm/graalvm-ce-builds/releases/download/graal-25.2.4/graalvm-community-jdk-25i2-25.0.4_linux-aarch64_bin.tar.gz"
|
||||
"https://services.gradle.org/distributions/gradle-${_gradle_version}-bin.zip")
|
||||
"https://services.gradle.org/distributions/gradle-${_gradle_version}-bin.zip"
|
||||
"limine-apple-gate"
|
||||
"mkinitcpio-install.hook")
|
||||
license=("GPL3")
|
||||
provides=('limine-entry-tool')
|
||||
options=(!debug !strip)
|
||||
@@ -31,10 +33,12 @@ makedepends=('git')
|
||||
makedepends_x86_64=('gradle')
|
||||
backup=(etc/limine-entry-tool.conf)
|
||||
conflicts=('limine-entry-tool')
|
||||
sha256sums=('6c4affb6fb6367a1222f7d0c54957a3142781d7894bbf61b1a274bd153e5d869')
|
||||
sha256sums=('267e0496d863b01903d6b99dae8c222a0ec33c4108a8a5d6e9b38eaa4a4a2edf')
|
||||
sha256sums_x86_64=('3f4a89de8eaa96f2ed677f09957c7e872cd8467aad3537f8b5394c1b8c4b942e')
|
||||
sha256sums_aarch64=('22286f7ecd21b9aedb3226b9bf797469e1bd3eefc491e12ef3dd49b452d230b7'
|
||||
'acd53f1edaf02f1a8ff99879f8a34b302661a057d9b063ae9e35b552f804d20a')
|
||||
'acd53f1edaf02f1a8ff99879f8a34b302661a057d9b063ae9e35b552f804d20a'
|
||||
'199fa2122e4a20ed80e6cf5df235b4e50739593803522bfa65700b1ef242b9ce'
|
||||
'9fc607e81d2f09aa0dfd313805277af92977535bd222f1e86caf5fbb28138cb4')
|
||||
|
||||
prepare() {
|
||||
[[ -d "${_graalvm_version}" ]] && rm -rf "${_graalvm_version}"
|
||||
@@ -77,4 +81,58 @@ package() {
|
||||
# limine hook symlinks
|
||||
ln -sf /usr/bin/limine-reset-enroll "$pkgdir/etc/boot/hooks/pre.d/10-limine-reset-enroll"
|
||||
ln -sf /usr/bin/limine-enroll-config "$pkgdir/etc/boot/hooks/post.d/90-limine-enroll-config"
|
||||
|
||||
if [[ $CARCH == aarch64 ]]; then
|
||||
_apple_silicon_hooks
|
||||
fi
|
||||
}
|
||||
|
||||
# An Apple Silicon Mac boots GRUB until Omarchy activates Limine, and keeps
|
||||
# the kernel and initramfs that mkinitcpio's presets install under /boot
|
||||
# after that too (GRUB, the boot check and the snapshot tools read them).
|
||||
# The aarch64 hooks and mkinitcpio wrapper run through limine-apple-gate,
|
||||
# which leaves every other machine as upstream ships it. On a Mac:
|
||||
# - Limine's kernel and removal hooks wait until Limine is active;
|
||||
# - mkinitcpio's own kernel hook, which Limine's takes over by name, runs from
|
||||
# a copy of mkinitcpio 42's (mkinitcpio-install.hook: keep its triggers in
|
||||
# step with mkinitcpio's), just before Limine's;
|
||||
# - Limine's EFI deploy hook stays out: omarchy-mac-boot puts Limine in
|
||||
# U-Boot's EFI/BOOT/BOOTAA64.EFI slot;
|
||||
# - the wrapper is plain mkinitcpio: it would run limine-mkinitcpio after
|
||||
# every preset build, mkinitcpio's kernel hook included.
|
||||
_apple_silicon_hooks() {
|
||||
local scripts=/usr/share/libalpm/scripts
|
||||
local gate=$scripts/limine-apple-gate
|
||||
local hooks="$pkgdir/usr/share/libalpm/hooks"
|
||||
local kernel_hook="$pkgdir/etc/pacman.d/hooks/90-mkinitcpio-install.hook"
|
||||
local mac_hook="$hooks/90-mkinitcpio-apple-install.hook"
|
||||
local wrapper="$pkgdir/usr/local/bin/mkinitcpio"
|
||||
|
||||
install -Dm755 "$srcdir/limine-apple-gate" "$pkgdir$gate"
|
||||
install -Dm644 "$srcdir/mkinitcpio-install.hook" "$mac_hook"
|
||||
sed -i -e 's|^Description = .*|Description = Updating linux initcpios under /boot (Apple Silicon)...|' \
|
||||
-e "s|^Exec = $scripts/mkinitcpio install\$|Exec = $gate --mac $scripts/mkinitcpio install|" "$mac_hook"
|
||||
sed -i "s|^Exec = $scripts/limine-mkinitcpio-|Exec = $gate $scripts/limine-mkinitcpio-|" \
|
||||
"$kernel_hook" "$hooks/60-limine-mkinitcpio-remove-pre.hook" "$hooks/90-limine-mkinitcpio-remove-post.hook"
|
||||
sed -i "s|^Exec = /usr/bin/limine-install\$|Exec = $gate --not-mac /usr/bin/limine-install|" "$hooks/80-limine-efi-deploy.hook"
|
||||
sed -i "1a $gate --mac \\&\\& exec /usr/bin/mkinitcpio \"\$@\"" "$wrapper"
|
||||
|
||||
local expected=(
|
||||
"$mac_hook|Exec = $gate --mac $scripts/mkinitcpio install"
|
||||
"$kernel_hook|Exec = $gate $scripts/limine-mkinitcpio-install"
|
||||
"$hooks/60-limine-mkinitcpio-remove-pre.hook|Exec = $gate $scripts/limine-mkinitcpio-remove pre"
|
||||
"$hooks/90-limine-mkinitcpio-remove-post.hook|Exec = $gate $scripts/limine-mkinitcpio-remove post"
|
||||
"$hooks/80-limine-efi-deploy.hook|Exec = $gate --not-mac /usr/bin/limine-install"
|
||||
)
|
||||
local entry
|
||||
for entry in "${expected[@]}"; do
|
||||
[[ $(grep '^Exec = ' "${entry%%|*}") == "${entry#*|}" ]] || {
|
||||
echo "${entry%%|*}: expected '${entry#*|}'" >&2
|
||||
return 1
|
||||
}
|
||||
done
|
||||
[[ $(sed -n 1,2p "$wrapper") == $'#!/usr/bin/env bash\n'"$gate --mac && exec /usr/bin/mkinitcpio \"\$@\"" ]] || {
|
||||
echo "the mkinitcpio wrapper does not start with the Apple Silicon gate" >&2
|
||||
return 1
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
#!/bin/bash
|
||||
# The aarch64 package runs its pacman hooks and its mkinitcpio wrapper through
|
||||
# this, so that only an Apple Silicon Mac behaves differently from upstream:
|
||||
#
|
||||
# limine-apple-gate COMMAND... COMMAND, except on a Mac that has not activated Limine
|
||||
# limine-apple-gate --mac COMMAND... COMMAND on a Mac only
|
||||
# limine-apple-gate --not-mac COMMAND... COMMAND everywhere but a Mac
|
||||
# limine-apple-gate --mac succeeds on a Mac only
|
||||
#
|
||||
# A Mac boots GRUB until Omarchy activates Limine: the gate
|
||||
# /var/lib/omarchy/limine.enabled and the /etc/default/limine the activation
|
||||
# writes, the same test as omarchy-mac-limine-active. A command that does not
|
||||
# run reads the targets pacman streams to it and succeeds quietly.
|
||||
|
||||
gate=/var/lib/omarchy/limine.enabled
|
||||
limine_default=/etc/default/limine
|
||||
compatible=(/proc/device-tree/compatible /sys/firmware/devicetree/base/compatible)
|
||||
|
||||
# Fixtures fake the machine for an unprivileged caller only; as root, which
|
||||
# pacman hooks always are, the live system decides.
|
||||
if ((EUID != 0)); then
|
||||
gate=${OMARCHY_LIMINE_GATE:-$gate}
|
||||
limine_default=${OMARCHY_LIMINE_DEFAULT:-$limine_default}
|
||||
if [[ -n ${OMARCHY_PROC_ROOT:-}${OMARCHY_SYS_ROOT:-} ]]; then
|
||||
compatible=()
|
||||
[[ -z ${OMARCHY_PROC_ROOT:-} ]] || compatible+=("$OMARCHY_PROC_ROOT/device-tree/compatible")
|
||||
[[ -z ${OMARCHY_SYS_ROOT:-} ]] || compatible+=("$OMARCHY_SYS_ROOT/firmware/devicetree/base/compatible")
|
||||
fi
|
||||
fi
|
||||
|
||||
# m1n1 names every Apple Silicon Mac "apple,<model>" in the root node's
|
||||
# NUL-separated compatible list, as omarchy-hw-platform reads it.
|
||||
is_mac() {
|
||||
local source
|
||||
for source in "${compatible[@]}"; do
|
||||
[[ -r $source ]] && tr '\0' '\n' <"$source" | grep -q '^apple,' && return 0
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
# pacman writes NeedsTargets to a socket and fails the write if the hook has
|
||||
# gone; hooks without NeedsTargets get no stdin at all.
|
||||
pass() {
|
||||
if [[ -S /dev/stdin || -p /dev/stdin ]]; then
|
||||
cat >/dev/null
|
||||
fi
|
||||
exit 0
|
||||
}
|
||||
|
||||
mode=limine
|
||||
case ${1:-} in
|
||||
--mac | --not-mac)
|
||||
mode=${1#--}
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
|
||||
if (($# == 0)); then
|
||||
[[ $mode == mac ]] && { is_mac; exit; }
|
||||
echo "usage: limine-apple-gate [--mac|--not-mac] COMMAND [ARG]..." >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
case $mode in
|
||||
mac) is_mac || pass ;;
|
||||
not-mac) ! is_mac || pass ;;
|
||||
limine) ! is_mac || [[ -e $gate && -f $limine_default ]] || pass ;;
|
||||
esac
|
||||
exec "$@"
|
||||
@@ -0,0 +1,38 @@
|
||||
[Trigger]
|
||||
Type = Path
|
||||
Operation = Install
|
||||
Operation = Upgrade
|
||||
Operation = Remove
|
||||
Target = usr/lib/initcpio/*
|
||||
Target = usr/lib/firmware/*
|
||||
Target = usr/lib/modules/*/extramodules/
|
||||
Target = usr/src/*/dkms.conf
|
||||
Target = usr/lib/systemd/systemd
|
||||
Target = usr/lib/systemd/systemd-udevd
|
||||
Target = usr/bin/cryptsetup
|
||||
Target = usr/bin/lvm
|
||||
Target = usr/bin/mdadm
|
||||
Target = usr/bin/pdata_tools
|
||||
Target = usr/lib/libcryptsetup.so
|
||||
Target = usr/lib/libp11-kit.so
|
||||
Target = usr/lib/libpcsclite.so
|
||||
Target = usr/lib/modprobe.d/
|
||||
|
||||
[Trigger]
|
||||
Type = Path
|
||||
Operation = Install
|
||||
Operation = Upgrade
|
||||
Target = usr/lib/modules/*/vmlinuz
|
||||
|
||||
[Trigger]
|
||||
Type = Package
|
||||
Operation = Install
|
||||
Operation = Upgrade
|
||||
Target = mkinitcpio
|
||||
Target = mkinitcpio-git
|
||||
|
||||
[Action]
|
||||
Description = Updating linux initcpios...
|
||||
When = PostTransaction
|
||||
Exec = /usr/share/libalpm/scripts/mkinitcpio install
|
||||
NeedsTargets
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"source": "local",
|
||||
"skip_build": true,
|
||||
"channels": ["edge"]
|
||||
}
|
||||
@@ -0,0 +1,226 @@
|
||||
# AArch64 Apple Silicon (Aurora Silicon)
|
||||
# Based on the asahi-alarm linux-asahi package by Jos Dehaes and Matthias Kurz.
|
||||
#
|
||||
# Aurora Silicon maintain a fork of the Asahi kernel carrying DisplayPort
|
||||
# alt-mode and USB4 support for external monitors, variable refresh rate, and
|
||||
# the ISP and AOP drivers. Those changes touch device trees, the type-C stack
|
||||
# and DRM, so they cannot ship as a module: this is a whole alternative kernel
|
||||
# for Macs on the Omarchy edge channel. It reaches rc and stable only after
|
||||
# cold-boot qualification on M1 and M2.
|
||||
|
||||
_auroraver=7.1.12
|
||||
_aurorarel=2
|
||||
pkgrel=11
|
||||
|
||||
# Immutable pin on aurora-silicon/linux (branch aurora-wip). Every bump is a
|
||||
# PR that moves _commit and the archive checksum; the pinned commit is cold-boot
|
||||
# qualified on MacBook Pro 14" M1 Pro (j314s) and 16" M2 Max (j416c) first.
|
||||
_commit=2439016d2e8d3a0d8aebcd243f29604a91f201c9
|
||||
|
||||
_m1n1_version=1.6.1
|
||||
|
||||
pkgbase=linux-aurora
|
||||
_srcname=linux-${_commit}
|
||||
_kernelname=${pkgbase#linux}
|
||||
_desc="AArch64 Apple Silicon (Aurora kernel)"
|
||||
pkgver="${_auroraver}.aurora${_aurorarel}"
|
||||
arch=('aarch64')
|
||||
url="https://github.com/aurora-silicon/linux"
|
||||
license=('GPL2')
|
||||
|
||||
makedepends=(
|
||||
base-devel bc dtc kmod libelf pahole cpio perl rustup rust-bindgen tar xz xmlto python
|
||||
)
|
||||
options=('!strip')
|
||||
source=(
|
||||
https://github.com/aurora-silicon/linux/archive/${_commit}.tar.gz
|
||||
config # the main kernel config file
|
||||
rust-toolchain.toml
|
||||
)
|
||||
sha256sums=('6347354537148120fc5448afcb8671a558ce336f731c70690cd88062a903f84d'
|
||||
'e8f3818e6bfa70166dd5caff228a0becfdd5d4f0165b589efa38150fd0b59cc9'
|
||||
'2a95563bb9f5b216cc3c170a17e9471448bc63a7084bdd67df23d074939b366c')
|
||||
|
||||
# Kbuild takes ARCH literally and knows arm64, not aarch64.
|
||||
export ARCH=arm64
|
||||
export KBUILD_BUILD_HOST=archlinux
|
||||
export KBUILD_BUILD_USER=$pkgbase
|
||||
export KBUILD_BUILD_TIMESTAMP="$(date -Ru${SOURCE_DATE_EPOCH:+d @$SOURCE_DATE_EPOCH})"
|
||||
|
||||
prepare() {
|
||||
cd $_srcname
|
||||
|
||||
echo "Setting version..."
|
||||
echo "-$_aurorarel-$pkgrel" > localversion.10-pkgrel
|
||||
|
||||
local src
|
||||
for src in "${source[@]}"; do
|
||||
src="${src%%::*}"
|
||||
src="${src##*/}"
|
||||
[[ $src = *.patch ]] || continue
|
||||
echo "Applying patch $src..."
|
||||
patch -Np1 < "../$src"
|
||||
done
|
||||
|
||||
echo "Pinning the Rust toolchain..."
|
||||
cp ../rust-toolchain.toml .
|
||||
|
||||
echo "Creating build directories..."
|
||||
mkdir -p build/base
|
||||
|
||||
echo "Setting config (base)..."
|
||||
cp ../config build/base/.config
|
||||
make olddefconfig prepare O=$PWD/build/base
|
||||
diff -u ../config build/base/.config || :
|
||||
make -s kernelrelease O=$PWD/build/base > build/base/version
|
||||
|
||||
echo "Prepared $pkgbase version $(<build/base/version)"
|
||||
}
|
||||
|
||||
build() {
|
||||
cd $_srcname
|
||||
echo "Building base..."
|
||||
make all O=$PWD/build/base -j $(nproc)
|
||||
}
|
||||
|
||||
_package_kernel() {
|
||||
pkgdesc="The $pkgdesc kernel and modules"
|
||||
depends=(coreutils kmod initramfs $2 "m1n1>=$_m1n1_version")
|
||||
optdepends=('crda: to set the correct wireless channels of your country'
|
||||
'linux-firmware: firmware images needed for some devices')
|
||||
# No generic linux provide: on a shared aarch64 repository it would compete
|
||||
# with linux-aarch64 for any dependency on linux.
|
||||
provides=(WIREGUARD-MODULE linux-asahi=${pkgver})
|
||||
conflicts=(linux-asahi)
|
||||
|
||||
local kernver="$(<$O/version)"
|
||||
local modulesdir="$pkgdir/usr/lib/modules/$kernver"
|
||||
|
||||
echo "Installing boot image..."
|
||||
# systemd expects to find the kernel here to allow hibernation
|
||||
# https://github.com/systemd/systemd/commit/edda44605f06a41fb86b7ab8128dcf99161d2344
|
||||
install -Dm644 "$O"/arch/arm64/boot/Image "$modulesdir/vmlinuz"
|
||||
|
||||
# Used by mkinitcpio to name the kernel
|
||||
echo "$1" | install -Dm644 /dev/stdin "$modulesdir/pkgbase"
|
||||
|
||||
echo "Installing modules..."
|
||||
make O="$O" INSTALL_MOD_PATH="$pkgdir/usr" INSTALL_MOD_STRIP=1 modules_install
|
||||
|
||||
echo "Installing device trees..."
|
||||
install -Dt "$modulesdir/dtbs" "$O"/arch/arm64/boot/dts/apple/*.dtb
|
||||
|
||||
# remove build and source links
|
||||
rm -f "$modulesdir"/{source,build}
|
||||
}
|
||||
|
||||
_package() {
|
||||
cd $_srcname
|
||||
export O="$PWD/build/base"
|
||||
_package_kernel "$pkgbase"
|
||||
}
|
||||
|
||||
_package-headers() {
|
||||
pkgdesc="Headers and scripts for building modules for the $pkgdesc kernel"
|
||||
depends=(pahole)
|
||||
provides=(linux-asahi-headers=${pkgver})
|
||||
conflicts=(linux-asahi-headers)
|
||||
|
||||
KARCH=arm64
|
||||
|
||||
cd $_srcname
|
||||
O=build/base
|
||||
local builddir="$pkgdir/usr/lib/modules/$(<${O}/version)/build"
|
||||
|
||||
echo "Installing build files..."
|
||||
install -Dt "$builddir" -m644 $O/.config Makefile $O/Module.symvers $O/System.map \
|
||||
localversion.* $O/version $O/vmlinux
|
||||
install -Dt "$builddir/kernel" -m644 kernel/Makefile
|
||||
cp -t "$builddir" -a scripts $O/scripts
|
||||
|
||||
# required when STACK_VALIDATION is enabled
|
||||
#install -Dt "$builddir/tools/objtool" tools/objtool/objtool
|
||||
|
||||
# required when DEBUG_INFO_BTF_MODULES is enabled
|
||||
install -Dt "$builddir/tools/bpf/resolve_btfids" $O/tools/bpf/resolve_btfids/resolve_btfids
|
||||
|
||||
echo "Installing headers..."
|
||||
cp -t "$builddir" -a include $O/include
|
||||
|
||||
install -Dt "${builddir}/arch/${KARCH}" -m644 arch/${KARCH}/Makefile
|
||||
install -Dt "${builddir}/arch/${KARCH}/kernel" -m644 $O/arch/${KARCH}/kernel/asm-offsets.s
|
||||
cp -t "${builddir}/arch/${KARCH}" -a arch/${KARCH}/include $O/arch/${KARCH}/include
|
||||
|
||||
install -Dt "$builddir/drivers/md" -m644 drivers/md/*.h
|
||||
install -Dt "$builddir/net/mac80211" -m644 net/mac80211/*.h
|
||||
|
||||
# https://bugs.archlinux.org/task/13146
|
||||
install -Dt "$builddir/drivers/media/i2c" -m644 drivers/media/i2c/msp3400-driver.h
|
||||
|
||||
# https://bugs.archlinux.org/task/20402
|
||||
install -Dt "$builddir/drivers/media/usb/dvb-usb" -m644 drivers/media/usb/dvb-usb/*.h
|
||||
install -Dt "$builddir/drivers/media/dvb-frontends" -m644 drivers/media/dvb-frontends/*.h
|
||||
install -Dt "$builddir/drivers/media/tuners" -m644 drivers/media/tuners/*.h
|
||||
|
||||
# https://bugs.archlinux.org/task/71392
|
||||
install -Dt "$builddir/drivers/iio/common/hid-sensors" -m644 drivers/iio/common/hid-sensors/*.h
|
||||
|
||||
echo "Installing KConfig files..."
|
||||
find . -name 'Kconfig*' -exec install -Dm644 {} "$builddir/{}" \;
|
||||
|
||||
echo "Installing unstripped VDSO..."
|
||||
make O="$O" INSTALL_MOD_PATH="$pkgdir/usr" vdso_install link=
|
||||
|
||||
echo "Removing unneeded architectures..."
|
||||
local arch
|
||||
for arch in "$builddir"/arch/*/; do
|
||||
[[ $arch = */${KARCH}/ ]] && continue
|
||||
echo "Removing $(basename "$arch")"
|
||||
rm -r "$arch"
|
||||
done
|
||||
|
||||
echo "Removing documentation..."
|
||||
rm -r "$builddir/Documentation"
|
||||
|
||||
echo "Removing broken symlinks..."
|
||||
find -L "$builddir" -type l -printf 'Removing %P\n' -delete
|
||||
|
||||
echo "Removing loose objects..."
|
||||
find "$builddir" -type f -name '*.o' -printf 'Removing %P\n' -delete
|
||||
|
||||
echo "Removing cmd files..."
|
||||
find "$builddir" -type f -name '*.cmd' -printf 'Removing %P\n' -delete
|
||||
|
||||
echo "Stripping build tools..."
|
||||
local file
|
||||
while read -rd '' file; do
|
||||
case "$(file --no-sandbox -bi "$file")" in
|
||||
application/x-sharedlib\;*) # Libraries (.so)
|
||||
strip -v $STRIP_SHARED "$file" ;;
|
||||
application/x-archive\;*) # Libraries (.a)
|
||||
strip -v $STRIP_STATIC "$file" ;;
|
||||
application/x-executable\;*) # Binaries
|
||||
strip -v $STRIP_BINARIES "$file" ;;
|
||||
application/x-pie-executable\;*) # Relocatable binaries
|
||||
strip -v $STRIP_SHARED "$file" ;;
|
||||
esac
|
||||
done < <(find "$builddir" -type f -perm -u+x ! -name vmlinux -print0)
|
||||
|
||||
echo "Stripping vmlinux..."
|
||||
strip -v $STRIP_STATIC "$builddir/vmlinux"
|
||||
|
||||
echo "Adding symlink..."
|
||||
mkdir -p "$pkgdir/usr/src"
|
||||
ln -sr "$builddir" "$pkgdir/usr/src/$pkgbase"
|
||||
|
||||
}
|
||||
|
||||
pkgname=("$pkgbase" "$pkgbase-headers")
|
||||
for _p in "${pkgname[@]}"; do
|
||||
eval "package_$_p() {
|
||||
$(declare -f "_package${_p#$pkgbase}")
|
||||
_package${_p#$pkgbase}
|
||||
}"
|
||||
done
|
||||
|
||||
# vim:set ts=8 sts=2 sw=2 et:
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,4 @@
|
||||
[toolchain]
|
||||
channel = "1.93.1"
|
||||
components = ["rustc", "cargo", "rust-src"]
|
||||
targets = ["aarch64-unknown-linux-gnu"]
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"source": "local",
|
||||
"channels": ["edge"],
|
||||
"sync": false
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
# m1n1 for linux-aurora. Aurora's device trees name the USB4 aliases
|
||||
# usb4-N-acio, usb4-N-nhi and usb4-N-pcie-adapter; m1n1 v1.6.1 only looks up
|
||||
# the usb4_N_* names, so without the alias fallback the USB4 tunables are
|
||||
# never applied. The Asahi m1n1 stays with linux-asahi.
|
||||
pkgname=m1n1-aurora
|
||||
pkgver=1.6.1.aurora1
|
||||
pkgrel=3
|
||||
pkgdesc='Omarchy Aurora m1n1 with compatible USB4 tunable aliases'
|
||||
arch=('aarch64')
|
||||
url='https://github.com/aurora-silicon/m1n1'
|
||||
license=('MIT' 'CC0-1.0' 'OFL-1.1-RFN' 'Zlib' 'BSD-2-Clause OR GPL-2.0-or-later' 'BSD-3-Clause OR GPL-2.0-or-later' 'MIT OR Apache-2.0')
|
||||
provides=("m1n1=$pkgver")
|
||||
conflicts=('m1n1')
|
||||
makedepends=('clang' 'lld' 'llvm' 'rustup' 'make' 'patch')
|
||||
options=('!strip' '!debug')
|
||||
_commit=06a4601a351ebfd1abb6abba9a44c34e40d94776
|
||||
source=("m1n1-${_commit}.tar.gz::https://github.com/aurora-silicon/m1n1/archive/${_commit}.tar.gz"
|
||||
aurora-cio-aliases.patch
|
||||
bootlogo_48.bin
|
||||
bootlogo_128.bin
|
||||
bootlogo_256.bin
|
||||
)
|
||||
sha256sums=('9d6972d3edaff856e985f2b1feb64fcf9b42fc5eecda7be64a242b49bbbe636d'
|
||||
'4345a4e431642c4316595bdf023bc67d5c72e0374f3c8d59be81318710138f32'
|
||||
'6668050653645711ad7523fe2abeb4cbe85a92c875f3eec754b6db23cea2191c'
|
||||
'b19cb017645c7a9068ea0be9b6bb394131d7ca11b28093cf6caa1ffca74b0a4e'
|
||||
'9c659b392aacfa31c62c638003d2257abfdbe17919b5c90cde4c4e62f87addab')
|
||||
|
||||
prepare() {
|
||||
cd "m1n1-$_commit"
|
||||
patch -p1 < "$srcdir/aurora-cio-aliases.patch"
|
||||
for size in 48 128 256; do
|
||||
cp "$srcdir/bootlogo_$size.bin" "data/bootlogo_$size.bin"
|
||||
done
|
||||
rustup toolchain install 1.89.0 --profile minimal --target aarch64-unknown-none-softfloat
|
||||
}
|
||||
|
||||
build() {
|
||||
cd "m1n1-$_commit"
|
||||
RUSTUP_TOOLCHAIN=1.89.0 make RELEASE=1 USE_CLANG=1 ARCH=aarch64-linux-gnu \
|
||||
M1N1_VERSION_TAG=v1.6.1-omarchy.aurora1
|
||||
}
|
||||
|
||||
package() {
|
||||
# asahi-scripts (update-m1n1 and its pacman hook) only exists in the
|
||||
# asahi-alarm repository, which the builder does not configure. Declared
|
||||
# here so makepkg does not try to install it at build time.
|
||||
depends=('asahi-scripts>=20260127.1')
|
||||
|
||||
cd "m1n1-$_commit"
|
||||
install -Dm644 build/m1n1.bin "$pkgdir/usr/lib/asahi-boot/m1n1.bin"
|
||||
install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
|
||||
install -m644 3rdparty_licenses/* "$pkgdir/usr/share/licenses/$pkgname/"
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
# m1n1-aurora
|
||||
|
||||
m1n1 v1.6.1 from aurora-silicon/m1n1 (06a4601a351ebfd1abb6abba9a44c34e40d94776) with RC, NHI and PCIe adapter alias fallbacks for the USB4 tunables, plus the Omarchy boot logos. Aurora's device trees name those aliases `usb4-N-acio`, `usb4-N-nhi` and `usb4-N-pcie-adapter`; stock m1n1 only looks up the `usb4_N_*` names. Latest Aurora m1n1 main is not qualified.
|
||||
|
||||
## Pairing with linux-aurora
|
||||
|
||||
- It provides `m1n1=1.6.1.aurora1`, which satisfies linux-aurora's `m1n1>=1.6.1`, and conflicts with asahi-alarm's `m1n1`. pacman prefers a package literally named `m1n1` over a provider, so an Aurora transaction names `m1n1-aurora` explicitly and accepts its conflict with `m1n1` (`--ask 4` under `--noconfirm`).
|
||||
- It owns `/usr/lib/asahi-boot/m1n1.bin`. asahi-scripts' `95-m1n1-install.hook` runs `update-m1n1` when that file, `/usr/lib/modules/*/dtbs/*` or U-Boot changes. `update-m1n1` writes m1n1, the device trees and gzipped U-Boot into `m1n1/boot.bin` on the system ESP. asahi-alarm's default takes the device trees from the newest `/lib/modules/*-ARCH/dtbs`, which is where linux-aurora installs its Apple DTBs. `/etc/default/update-m1n1` overrides are left alone.
|
||||
- Raising linux-aurora's `_m1n1_version` above 1.6.1 needs an m1n1-aurora whose provided version satisfies it, released first.
|
||||
|
||||
## Qualification
|
||||
|
||||
Each bump is cold-boot qualified on the M1 Pro and M2 Max: package installation, the hook rebuilding `boot.bin`, the logo, physical boot and two external displays. A successful build is not hardware acceptance.
|
||||
@@ -0,0 +1,28 @@
|
||||
diff --git a/src/kboot.c b/src/kboot.c
|
||||
index a5bd4f1..1089666 100644
|
||||
--- a/src/kboot.c
|
||||
+++ b/src/kboot.c
|
||||
@@ -1249,17 +1249,23 @@ static int dt_set_acio_tunables(void)
|
||||
|
||||
memset(fdt_alias, 0, sizeof(fdt_alias));
|
||||
snprintf(fdt_alias, sizeof(fdt_alias), "usb4_%d_rc", i);
|
||||
+ if (!fdt_get_alias(dt, fdt_alias))
|
||||
+ snprintf(fdt_alias, sizeof(fdt_alias), "usb4-%d-acio", i);
|
||||
dt_copy_acio_tunables(adt_path, fdt_alias, usb4_rc_tunables,
|
||||
sizeof(usb4_rc_tunables) / sizeof(*usb4_rc_tunables));
|
||||
|
||||
memset(fdt_alias, 0, sizeof(fdt_alias));
|
||||
snprintf(fdt_alias, sizeof(fdt_alias), "usb4_%d_pcie_adapter", i);
|
||||
+ if (!fdt_get_alias(dt, fdt_alias))
|
||||
+ snprintf(fdt_alias, sizeof(fdt_alias), "usb4-%d-pcie-adapter", i);
|
||||
dt_copy_acio_tunables(adt_path, fdt_alias, usb4_pcie_adapter_tunables,
|
||||
sizeof(usb4_pcie_adapter_tunables) /
|
||||
sizeof(*usb4_pcie_adapter_tunables));
|
||||
|
||||
memset(fdt_alias, 0, sizeof(fdt_alias));
|
||||
snprintf(fdt_alias, sizeof(fdt_alias), "usb4_%d_nhi", i);
|
||||
+ if (!fdt_get_alias(dt, fdt_alias))
|
||||
+ snprintf(fdt_alias, sizeof(fdt_alias), "usb4-%d-nhi", i);
|
||||
dt_copy_acio_tunables(adt_path, fdt_alias, usb4_nhi_tunables,
|
||||
sizeof(usb4_nhi_tunables) / sizeof(*usb4_nhi_tunables));
|
||||
dt_copy_usb4_drom(adt_path, fdt_alias);
|
||||
Binary file not shown.
@@ -0,0 +1 @@
|
||||
榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻j�榻jLine truncated
|
||||
Binary file not shown.
@@ -0,0 +1,4 @@
|
||||
[microsoft-edge-stable-bin]
|
||||
source = "regex"
|
||||
url = "https://packages.microsoft.com/repos/edge/dists/stable/main/binary-amd64/Packages"
|
||||
regex = "(?s)Package: microsoft-edge-stable\\n.*?Version: ([0-9.]+)-"
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"source": "local",
|
||||
"release_ring": "fast",
|
||||
"upstream": {
|
||||
"watch": {
|
||||
"debian": "https://packages.microsoft.com/repos/edge/dists/stable/main/binary-amd64/Packages",
|
||||
"package": "microsoft-edge-stable",
|
||||
"pattern": "(?P<version>[0-9]+(?:\\.[0-9]+)*)-1"
|
||||
}
|
||||
},
|
||||
"origin": {
|
||||
"aur": "microsoft-edge-stable-bin",
|
||||
"commit": "4f6358224df9e58ad9ef84980505d1ead732f8dc"
|
||||
}
|
||||
}
|
||||
BIN
Binary file not shown.
@@ -0,0 +1,74 @@
|
||||
|
||||
# Maintainer: Peter Jung <ptr1337@archlinux.org>
|
||||
# Contributor: Aakash Hemadri <aakashhemadri123@gmail.com>
|
||||
# Contributor: Nicolas Narvaez <nicomix1006@gmail.com>
|
||||
# Contributor: Luna Jernberg <droidbittin@gmail.com>
|
||||
# Contributor: EsauPR
|
||||
# Contributor: nowy
|
||||
|
||||
pkgname=microsoft-edge-stable-bin
|
||||
_pkgname=microsoft-edge
|
||||
_pkgshortname=msedge
|
||||
_channel=stable
|
||||
pkgver=154.0.4258.37
|
||||
pkgrel=2
|
||||
pkgdesc="A browser that combines a minimal design with sophisticated technology to make the web faster, safer, and easier"
|
||||
arch=('x86_64')
|
||||
url="https://www.microsoftedgeinsider.com/en-us/download"
|
||||
license=('Licenseref-custom')
|
||||
provides=('microsoft-edge-stable' 'edge-stable')
|
||||
conflicts=('microsoft-edge-stable' 'edge-stable' 'edge-stable-bin' 'edge')
|
||||
depends=('gtk3' 'libcups' 'nss' 'alsa-lib' 'libxtst' 'libdrm' 'mesa' 'libxml2')
|
||||
makedepends=('imagemagick')
|
||||
optdepends=(
|
||||
'libpipewire: WebRTC desktop sharing under Wayland'
|
||||
'kdialog: for file dialogs in KDE'
|
||||
'gnome-keyring: for storing passwords in GNOME keyring'
|
||||
'kwallet: for storing passwords in KWallet'
|
||||
'libunity: for download progress on KDE'
|
||||
'ttf-liberation: fix fonts for some PDFs - CRBug #369991'
|
||||
'xdg-utils'
|
||||
)
|
||||
options=(!strip !zipman !emptydirs)
|
||||
source=("https://packages.microsoft.com/repos/edge/pool/main/m/microsoft-edge-stable/${_pkgname}-${_channel}_${pkgver}-1_amd64.deb"
|
||||
"microsoft-edge-stable.sh"
|
||||
"Microsoft Standard Application License Terms - Standalone (free) Use Terms.pdf")
|
||||
sha256sums=('c6fa2974733991321b46c4064b785cdec5a14d8cddd182bc5fda057e37e7603d'
|
||||
'dc3765d2de6520b13f105b8001aa0e40291bc9457ac508160b23eea8811e26af'
|
||||
'edf2ed596eb068f168287fc76aa713ad5e0afb59f0a0a47a4f29c0c124ade15e')
|
||||
|
||||
package() {
|
||||
bsdtar -xf data.tar.xz -C "$pkgdir/"
|
||||
|
||||
# suid sandbox
|
||||
chmod 4755 "${pkgdir}/opt/microsoft/${_pkgshortname}/msedge-sandbox"
|
||||
|
||||
# 256 and 24 are proper colored icons
|
||||
for res in 128 64 48 32; do
|
||||
magick "${pkgdir}/opt/microsoft/${_pkgshortname}/product_logo_256.png" \
|
||||
-resize ${res}x${res} \
|
||||
"${pkgdir}/opt/microsoft/${_pkgshortname}/product_logo_${res}.png"
|
||||
done
|
||||
for res in 22 16; do
|
||||
magick "${pkgdir}/opt/microsoft/${_pkgshortname}/product_logo_24.png" \
|
||||
-resize ${res}x${res} \
|
||||
"${pkgdir}/opt/microsoft/${_pkgshortname}/product_logo_${res}.png"
|
||||
done
|
||||
|
||||
# install icons
|
||||
for res in 16 24 32 48 64 128 256; do
|
||||
install -Dm644 "${pkgdir}/opt/microsoft/${_pkgshortname}/product_logo_${res}.png" \
|
||||
"${pkgdir}/usr/share/icons/hicolor/${res}x${res}/apps/${_pkgname}.png"
|
||||
done
|
||||
|
||||
# User flag aware launcher
|
||||
install -m755 microsoft-edge-stable.sh "${pkgdir}/usr/bin/microsoft-edge-stable"
|
||||
# License
|
||||
install -Dm644 'Microsoft Standard Application License Terms - Standalone (free) Use Terms.pdf' "${pkgdir}/usr/share/licenses/${_pkgname}/LICENSE.pdf"
|
||||
rm "${pkgdir}/opt/microsoft/${_pkgshortname}"/product_logo_*.png
|
||||
|
||||
# Remove the Debian cron job, which installs an apt keyring pacman doesn't track
|
||||
rm -r \
|
||||
"${pkgdir}/etc/cron.daily/" \
|
||||
"${pkgdir}/opt/microsoft/${_pkgshortname}/cron/"
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
# Colored makepkg-like functions
|
||||
msg_blue() {
|
||||
printf "${blue}==>${bold} $1${all_off}\n"
|
||||
}
|
||||
|
||||
note() {
|
||||
printf "${blue}==>${yellow} NOTE:${bold} $1${all_off}\n"
|
||||
}
|
||||
|
||||
all_off="$(tput sgr0)"
|
||||
bold="${all_off}$(tput bold)"
|
||||
blue="${bold}$(tput setaf 4)"
|
||||
yellow="${bold}$(tput setaf 3)"
|
||||
|
||||
post_install() {
|
||||
note "Custom flags should be put directly in: ~/.config/microsoft-edge-stable-flags.conf"
|
||||
note "The launcher is called: 'microsoft-edge-stable'"
|
||||
}
|
||||
|
||||
post_upgrade() {
|
||||
post_install
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
#!/usr/bin/env sh
|
||||
# Launches MS Edge with flags specified in $XDG_CONFIG_HOME/microsoft-edge-beta-flags.conf
|
||||
|
||||
# Make script fail if `cat` fails for some reason
|
||||
set -e
|
||||
|
||||
# Set default value if variable is unset/null
|
||||
XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-${HOME}/.config}"
|
||||
|
||||
# Attempt to read a config file if it exists
|
||||
if [ -r "${XDG_CONFIG_HOME}/microsoft-edge-stable-flags.conf" ]; then
|
||||
EDGE_USER_FLAGS="$(cat "$XDG_CONFIG_HOME/microsoft-edge-stable-flags.conf")"
|
||||
fi
|
||||
|
||||
exec /opt/microsoft/msedge/microsoft-edge $EDGE_USER_FLAGS "$@"
|
||||
@@ -1,6 +1,6 @@
|
||||
# Maintainer: Jeff Dickey <releases@mise.jdx.dev>
|
||||
pkgname=mise-bin
|
||||
pkgver=2026.9.12
|
||||
pkgver=2026.9.14
|
||||
pkgrel=1
|
||||
pkgdesc="dev tools, env vars, task runner"
|
||||
arch=('x86_64' 'aarch64')
|
||||
@@ -14,8 +14,8 @@ provides=('mise')
|
||||
conflicts=('mise')
|
||||
source_x86_64=("https://github.com/jdx/mise/releases/download/v${pkgver}/mise-v${pkgver}-linux-x64.tar.xz")
|
||||
source_aarch64=("https://github.com/jdx/mise/releases/download/v${pkgver}/mise-v${pkgver}-linux-arm64.tar.xz")
|
||||
sha256sums_x86_64=('30c79a0a24d8f0ad80e6c9b11ec54816be2a9b77e7eeae32c1267a5b9d34d3d7')
|
||||
sha256sums_aarch64=('7bc2a5558b787a33f22e4b5955cfec58871ad3723658418ad3d2cdf5a0e693b9')
|
||||
sha256sums_x86_64=('849cf8eb77d4ccf1eb9fd87cbd757e863e64bcd8623a8865a651af2a1579dace')
|
||||
sha256sums_aarch64=('3405d3fe8c1491ace3bfbb76e88b5ddbbbfc2f1495dcaad6455607ec782d2a5d')
|
||||
|
||||
package() {
|
||||
install -Dm755 "${srcdir}/mise/bin/mise" "${pkgdir}/usr/bin/mise"
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
{
|
||||
"source": "local"
|
||||
"source": "local",
|
||||
"upstream": {
|
||||
"git_tags": "https://github.com/omacom/monologue.git",
|
||||
"tag_pattern": "v{pkgver}",
|
||||
"sources": {
|
||||
"any": [
|
||||
"https://github.com/omacom/monologue/archive/refs/tags/{tag}.tar.gz"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,8 @@
|
||||
# Maintainer: David Heinemeier Hansson <david@hey.com>
|
||||
|
||||
pkgname=monologue
|
||||
pkgver=0.1.0
|
||||
pkgrel=3
|
||||
pkgver=0.2.0
|
||||
pkgrel=1
|
||||
pkgdesc='A simple, theme-synced webcam recorder for Omarchy'
|
||||
arch=('x86_64' 'aarch64')
|
||||
url='https://github.com/omacom/monologue'
|
||||
@@ -19,19 +19,16 @@ depends=(
|
||||
'xdg-desktop-portal'
|
||||
)
|
||||
makedepends=('gcc' 'make' 'pkgconf')
|
||||
optdepends=('omacut: trim recordings directly from Monologue')
|
||||
# Pin the published source until a tagged release is available.
|
||||
_commit=23e0844f60feef2f9d2cf2c9d89f13eb0bf5adef
|
||||
source=("$pkgname-$_commit.tar.gz::$url/archive/$_commit.tar.gz")
|
||||
sha256sums=('1a04b9e47b29846e9135d110978f7f35c0274f7361729f0b6ac03796499c0ad6')
|
||||
source=("$pkgname-$pkgver.tar.gz::$url/archive/refs/tags/v$pkgver.tar.gz")
|
||||
sha256sums=('aef0e8d2d5f978e03d0e3a6c9685b828ff6a128d2dc136cb36e45458cdf62c69')
|
||||
|
||||
build() {
|
||||
cd "$srcdir/$pkgname-$_commit"
|
||||
cd "$srcdir/$pkgname-$pkgver"
|
||||
./bin/build
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "$srcdir/$pkgname-$_commit"
|
||||
cd "$srcdir/$pkgname-$pkgver"
|
||||
|
||||
install -Dm755 build/monologue "$pkgdir/usr/bin/monologue"
|
||||
install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"source": "local"
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
python3 "$(dirname "$0")/../upstream.py"
|
||||
@@ -0,0 +1,103 @@
|
||||
# Maintainer: Shun Li <riverscn@gmail.com>
|
||||
# Extracted from omacom/omarchy-pkgs PR #240, revision dcef132b2df11bb762e233ea8c6af3110f079b67.
|
||||
|
||||
pkgname=obsidian
|
||||
pkgver=1.13.7
|
||||
pkgrel=2
|
||||
pkgdesc='Knowledge base on top of a local folder of plain-text Markdown files'
|
||||
arch=('aarch64')
|
||||
url='https://obsidian.md/'
|
||||
license=('custom')
|
||||
depends=(
|
||||
'alsa-lib'
|
||||
'at-spi2-core'
|
||||
'cairo'
|
||||
'dbus'
|
||||
'expat'
|
||||
'fontconfig'
|
||||
'gcc-libs'
|
||||
'glib2'
|
||||
'glibc'
|
||||
'gtk3'
|
||||
'hicolor-icon-theme'
|
||||
'libcups'
|
||||
'libnotify'
|
||||
'libsecret'
|
||||
'libx11'
|
||||
'libxcb'
|
||||
'libxcomposite'
|
||||
'libxdamage'
|
||||
'libxext'
|
||||
'libxfixes'
|
||||
'libxkbcommon'
|
||||
'libxrandr'
|
||||
'mesa'
|
||||
'nspr'
|
||||
'nss'
|
||||
'pango'
|
||||
'systemd-libs'
|
||||
'xdg-utils'
|
||||
)
|
||||
provides=('obsidian')
|
||||
conflicts=('obsidian-appimage' 'obsidian-bin')
|
||||
options=('!debug' '!strip')
|
||||
checkdepends=('python')
|
||||
source=('obsidian.desktop' 'upstream.py' 'test-upstream.py')
|
||||
source_aarch64=(
|
||||
"obsidian-${pkgver}-arm64.tar.gz::https://github.com/obsidianmd/obsidian-releases/releases/download/v${pkgver}/obsidian-${pkgver}-arm64.tar.gz"
|
||||
)
|
||||
sha256sums=('42ecb332c900a01b2a6db0a70b4cc8c0553e863aee72894b23ed20a6289b131c'
|
||||
'd2933bdc97d9ba55986d710114512e0eb105e1cc549cef4aa7416cb333e0a9b8'
|
||||
'7213e4e691c53e184b0f037478ac6758fe44adad7a984fc1daef7fd17c31d5d8')
|
||||
sha256sums_aarch64=('98aac34d1f132a35cf506fc3fa196d595dcdeefdebd44b0cc5faaa7a1a210de2')
|
||||
|
||||
check() {
|
||||
python test-upstream.py
|
||||
}
|
||||
|
||||
package() {
|
||||
local source_dir="$srcdir/obsidian-${pkgver}-arm64"
|
||||
local install_dir="$pkgdir/opt/obsidian"
|
||||
|
||||
install -d "$install_dir"
|
||||
cp -a --no-preserve=ownership "$source_dir/." "$install_dir/"
|
||||
|
||||
# The official ARM64 archive currently carries two x86_64-only addons.
|
||||
# Remove only an unusable x86_64 payload; retain it automatically if the
|
||||
# vendor starts shipping an AArch64 build in a later release.
|
||||
local addon machine
|
||||
for addon in \
|
||||
resources/app.asar.unpacked/node_modules/btime/binding.node \
|
||||
resources/app.asar.unpacked/node_modules/get-fonts/binding.node; do
|
||||
[[ -f "$install_dir/$addon" ]] || continue
|
||||
machine=$(readelf -h "$install_dir/$addon" |
|
||||
sed -n 's/^[[:space:]]*Machine:[[:space:]]*//p')
|
||||
case "$machine" in
|
||||
AArch64) ;;
|
||||
'Advanced Micro Devices X86-64') rm -f "$install_dir/$addon" ;;
|
||||
*) error "Unexpected Obsidian addon architecture: $addon ($machine)"; return 1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
find "$install_dir" -type d -exec chmod 755 {} +
|
||||
find "$install_dir" -type f -exec chmod 644 {} +
|
||||
chmod 755 \
|
||||
"$install_dir/chrome_crashpad_handler" \
|
||||
"$install_dir/obsidian" \
|
||||
"$install_dir/obsidian-cli"
|
||||
# Chromium sandboxes through unprivileged user namespaces, which Arch-family
|
||||
# kernels allow; a setuid-root helper is not needed.
|
||||
chmod 755 "$install_dir/chrome-sandbox"
|
||||
|
||||
install -d "$pkgdir/usr/bin"
|
||||
ln -s /opt/obsidian/obsidian "$pkgdir/usr/bin/obsidian"
|
||||
ln -s /opt/obsidian/obsidian-cli "$pkgdir/usr/bin/obsidian-cli"
|
||||
install -Dm644 "$srcdir/obsidian.desktop" \
|
||||
"$pkgdir/usr/share/applications/obsidian.desktop"
|
||||
install -Dm644 "$install_dir/resources/icon.png" \
|
||||
"$pkgdir/usr/share/icons/hicolor/512x512/apps/obsidian.png"
|
||||
install -Dm644 "$install_dir/LICENSE.electron.txt" \
|
||||
"$pkgdir/usr/share/licenses/$pkgname/LICENSE.electron.txt"
|
||||
install -Dm644 "$install_dir/LICENSES.chromium.html" \
|
||||
"$pkgdir/usr/share/licenses/$pkgname/LICENSES.chromium.html"
|
||||
}
|
||||
Loaded 100 of 191 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user