Compare commits
4
Commits
b0b4fb69cb
...
2026.8.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eb65c1def7 | ||
|
|
96e3805568 | ||
|
|
2d9a10e85c | ||
|
|
12d1b2657f |
@@ -122,7 +122,6 @@ jobs:
|
|||||||
|
|
||||||
publish-arch:
|
publish-arch:
|
||||||
name: Build and publish gitty-desktop to AUR
|
name: Build and publish gitty-desktop to AUR
|
||||||
needs: publish-windows
|
|
||||||
runs-on: archlinux
|
runs-on: archlinux
|
||||||
environment: production
|
environment: production
|
||||||
env:
|
env:
|
||||||
@@ -136,11 +135,66 @@ jobs:
|
|||||||
- name: Prepare Arch job container
|
- name: Prepare Arch job container
|
||||||
working-directory: /
|
working-directory: /
|
||||||
run: |
|
run: |
|
||||||
pacman -Syu --noconfirm
|
set -euo pipefail
|
||||||
pacman -S --needed --noconfirm \
|
|
||||||
base-devel curl git nodejs npm openssh rust \
|
# The runner image may contain only a single geo mirror. Seed several
|
||||||
webkit2gtk-4.1 gtk3 hicolor-icon-theme \
|
# currently active HTTPS mirrors and retain the image's list as a
|
||||||
|
# fallback so one slow CDN cannot fail the complete release.
|
||||||
|
ARCH_MIRROR_BACKUP="$(mktemp)"
|
||||||
|
cp /etc/pacman.d/mirrorlist "$ARCH_MIRROR_BACKUP"
|
||||||
|
printf '%s\n' \
|
||||||
|
'Server = https://frankfurt.mirror.pkgbuild.com/$repo/os/$arch' \
|
||||||
|
'Server = https://mirror.osbeck.com/archlinux/$repo/os/$arch' \
|
||||||
|
'Server = https://mirror.ubrco.de/archlinux/$repo/os/$arch' \
|
||||||
|
'Server = https://ftp.halifax.rwth-aachen.de/archlinux/$repo/os/$arch' \
|
||||||
|
'Server = https://geo.mirror.pkgbuild.com/$repo/os/$arch' \
|
||||||
|
> /etc/pacman.d/mirrorlist
|
||||||
|
sed -n '/^[[:space:]]*Server[[:space:]]*=/p' "$ARCH_MIRROR_BACKUP" \
|
||||||
|
>> /etc/pacman.d/mirrorlist
|
||||||
|
|
||||||
|
ARCH_PACKAGES=(
|
||||||
|
base-devel curl git nodejs npm openssh rust
|
||||||
|
webkit2gtk-4.1 gtk3 hicolor-icon-theme
|
||||||
libappindicator-gtk3 librsvg xdotool
|
libappindicator-gtk3 librsvg xdotool
|
||||||
|
)
|
||||||
|
|
||||||
|
for ARCH_INSTALL_ATTEMPT in 1 2 3; do
|
||||||
|
echo "pacman attempt $ARCH_INSTALL_ATTEMPT of 3"
|
||||||
|
timeout --signal=TERM 30m \
|
||||||
|
pacman -Syu --needed --noconfirm --noprogressbar \
|
||||||
|
"${ARCH_PACKAGES[@]}" \
|
||||||
|
</dev/null &
|
||||||
|
ARCH_PACMAN_PID=$!
|
||||||
|
(
|
||||||
|
ARCH_WAIT_SECONDS=0
|
||||||
|
while true; do
|
||||||
|
sleep 30
|
||||||
|
((ARCH_WAIT_SECONDS += 30))
|
||||||
|
echo "pacman is still running (${ARCH_WAIT_SECONDS}s elapsed)"
|
||||||
|
done
|
||||||
|
) &
|
||||||
|
ARCH_HEARTBEAT_PID=$!
|
||||||
|
|
||||||
|
ARCH_PACMAN_STATUS=0
|
||||||
|
wait "$ARCH_PACMAN_PID" || ARCH_PACMAN_STATUS=$?
|
||||||
|
kill "$ARCH_HEARTBEAT_PID" 2>/dev/null || true
|
||||||
|
wait "$ARCH_HEARTBEAT_PID" 2>/dev/null || true
|
||||||
|
|
||||||
|
if [ "$ARCH_PACMAN_STATUS" -eq 0 ]; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$ARCH_PACMAN_STATUS" -eq 124 ]; then
|
||||||
|
echo "pacman attempt timed out after 30 minutes" >&2
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$ARCH_INSTALL_ATTEMPT" -eq 3 ]; then
|
||||||
|
echo "pacman failed after 3 attempts" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
sleep "$((ARCH_INSTALL_ATTEMPT * 5))"
|
||||||
|
done
|
||||||
|
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
@@ -187,6 +241,8 @@ jobs:
|
|||||||
AUR_GIT_NAME: ${{ vars.USERNAME_GIT }}
|
AUR_GIT_NAME: ${{ vars.USERNAME_GIT }}
|
||||||
AUR_GIT_EMAIL: ${{ vars.EMAIL_GIT }}
|
AUR_GIT_EMAIL: ${{ vars.EMAIL_GIT }}
|
||||||
run: |
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
if [ -z "$AUR_SSH_PRIVATE_KEY" ]; then
|
if [ -z "$AUR_SSH_PRIVATE_KEY" ]; then
|
||||||
echo "AUR_SSH_PRIVATE_KEY is required" >&2
|
echo "AUR_SSH_PRIVATE_KEY is required" >&2
|
||||||
exit 1
|
exit 1
|
||||||
@@ -195,13 +251,48 @@ jobs:
|
|||||||
install -d -m 0700 "$HOME/.ssh"
|
install -d -m 0700 "$HOME/.ssh"
|
||||||
printf '%s\n' "$AUR_SSH_PRIVATE_KEY" > "$HOME/.ssh/aur"
|
printf '%s\n' "$AUR_SSH_PRIVATE_KEY" > "$HOME/.ssh/aur"
|
||||||
chmod 0600 "$HOME/.ssh/aur"
|
chmod 0600 "$HOME/.ssh/aur"
|
||||||
ssh-keyscan -H aur.archlinux.org >> "$HOME/.ssh/known_hosts"
|
|
||||||
chmod 0600 "$HOME/.ssh/known_hosts"
|
|
||||||
export GIT_SSH_COMMAND="ssh -i $HOME/.ssh/aur -o IdentitiesOnly=yes"
|
|
||||||
|
|
||||||
AUR_CHECKOUT="$(mktemp -d)/gitty-desktop"
|
AUR_RETRY_DELAYS=(30 60 120 240)
|
||||||
git -c init.defaultBranch=master clone \
|
AUR_KNOWN_HOSTS_TEMP="$(mktemp)"
|
||||||
ssh://aur@aur.archlinux.org/gitty-desktop.git "$AUR_CHECKOUT"
|
AUR_HOST_KEY_READY=0
|
||||||
|
for AUR_ATTEMPT in 1 2 3 4 5; do
|
||||||
|
echo "AUR host-key attempt $AUR_ATTEMPT of 5"
|
||||||
|
if timeout 30s ssh-keyscan -T 15 -H aur.archlinux.org > "$AUR_KNOWN_HOSTS_TEMP" \
|
||||||
|
&& [ -s "$AUR_KNOWN_HOSTS_TEMP" ]; then
|
||||||
|
AUR_HOST_KEY_READY=1
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
if [ "$AUR_ATTEMPT" -lt 5 ]; then
|
||||||
|
sleep "${AUR_RETRY_DELAYS[$((AUR_ATTEMPT - 1))]}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ "$AUR_HOST_KEY_READY" -ne 1 ]; then
|
||||||
|
echo "Could not retrieve the AUR SSH host key after 5 attempts" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
install -m 0600 "$AUR_KNOWN_HOSTS_TEMP" "$HOME/.ssh/known_hosts"
|
||||||
|
export GIT_SSH_COMMAND="ssh -i $HOME/.ssh/aur -o IdentitiesOnly=yes -o BatchMode=yes -o ConnectTimeout=30 -o ServerAliveInterval=15 -o ServerAliveCountMax=2"
|
||||||
|
|
||||||
|
AUR_CHECKOUT_ROOT="$(mktemp -d)"
|
||||||
|
AUR_CHECKOUT=""
|
||||||
|
for AUR_ATTEMPT in 1 2 3 4 5; do
|
||||||
|
AUR_CLONE_CANDIDATE="$AUR_CHECKOUT_ROOT/attempt-$AUR_ATTEMPT"
|
||||||
|
echo "AUR clone attempt $AUR_ATTEMPT of 5"
|
||||||
|
if timeout 3m git -c init.defaultBranch=master clone \
|
||||||
|
ssh://aur@aur.archlinux.org/gitty-desktop.git "$AUR_CLONE_CANDIDATE"; then
|
||||||
|
AUR_CHECKOUT="$AUR_CLONE_CANDIDATE"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
if [ "$AUR_ATTEMPT" -lt 5 ]; then
|
||||||
|
echo "AUR is unavailable; retrying after backoff"
|
||||||
|
sleep "${AUR_RETRY_DELAYS[$((AUR_ATTEMPT - 1))]}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ -z "$AUR_CHECKOUT" ]; then
|
||||||
|
echo "Could not clone the AUR repository after 5 attempts" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
cp "$AUR_SOURCE_DIR/PKGBUILD" "$AUR_SOURCE_DIR/.SRCINFO" "$AUR_CHECKOUT/"
|
cp "$AUR_SOURCE_DIR/PKGBUILD" "$AUR_SOURCE_DIR/.SRCINFO" "$AUR_CHECKOUT/"
|
||||||
|
|
||||||
cd "$AUR_CHECKOUT"
|
cd "$AUR_CHECKOUT"
|
||||||
@@ -215,11 +306,25 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
git commit -m "Update to $PACKAGE_VERSION"
|
git commit -m "Update to $PACKAGE_VERSION"
|
||||||
git push origin HEAD:master
|
AUR_PUSHED=0
|
||||||
|
for AUR_ATTEMPT in 1 2 3 4 5; do
|
||||||
|
echo "AUR push attempt $AUR_ATTEMPT of 5"
|
||||||
|
if timeout 3m git push origin HEAD:master; then
|
||||||
|
AUR_PUSHED=1
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
if [ "$AUR_ATTEMPT" -lt 5 ]; then
|
||||||
|
echo "AUR push failed; retrying after backoff"
|
||||||
|
sleep "${AUR_RETRY_DELAYS[$((AUR_ATTEMPT - 1))]}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ "$AUR_PUSHED" -ne 1 ]; then
|
||||||
|
echo "Could not publish to AUR after 5 attempts" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
publish-ubuntu:
|
publish-ubuntu:
|
||||||
name: Build and publish Ubuntu AppImage
|
name: Build and publish Ubuntu AppImage
|
||||||
needs: publish-arch
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
environment: production
|
environment: production
|
||||||
|
|||||||
+2
-2
@@ -3967,10 +3967,10 @@
|
|||||||
helpOpen = false;
|
helpOpen = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (event.key === "Escape" && fileHistoryDialogOpen && !isBusy) closeFileHistoryDialog();
|
if (event.key === "Escape" && compareDialogOpen) closeCompareDialog();
|
||||||
|
else if (event.key === "Escape" && fileHistoryDialogOpen && !isBusy) closeFileHistoryDialog();
|
||||||
else if (event.key === "Escape" && repoTabContextMenu) closeRepoTabContextMenu();
|
else if (event.key === "Escape" && repoTabContextMenu) closeRepoTabContextMenu();
|
||||||
else if (event.key === "Escape" && pendingDiscard && !isBusy) closeDiscardConfirm();
|
else if (event.key === "Escape" && pendingDiscard && !isBusy) closeDiscardConfirm();
|
||||||
else if (event.key === "Escape" && compareDialogOpen) closeCompareDialog();
|
|
||||||
else if (event.key === "Escape" && newBranchCommit) newBranchCommit = null;
|
else if (event.key === "Escape" && newBranchCommit) newBranchCommit = null;
|
||||||
else if (event.key === "Escape" && renameBranchTarget) renameBranchTarget = null;
|
else if (event.key === "Escape" && renameBranchTarget) renameBranchTarget = null;
|
||||||
else if (event.key === "Escape" && deleteBranchTarget) closeDeleteBranchDialog();
|
else if (event.key === "Escape" && deleteBranchTarget) closeDeleteBranchDialog();
|
||||||
|
|||||||
@@ -2882,6 +2882,7 @@
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
.file-history-dialog-backdrop { z-index: 70; }
|
.file-history-dialog-backdrop { z-index: 70; }
|
||||||
|
.compare-dialog-backdrop { z-index: 80; }
|
||||||
.file-history-dialog {
|
.file-history-dialog {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-rows: auto minmax(0, 1fr);
|
grid-template-rows: auto minmax(0, 1fr);
|
||||||
|
|||||||
@@ -216,7 +216,7 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
class="dialog-backdrop"
|
class="dialog-backdrop compare-dialog-backdrop"
|
||||||
role="presentation"
|
role="presentation"
|
||||||
>
|
>
|
||||||
<div class="dialog compare-dialog" role="dialog" aria-modal="true" aria-label="Commit comparison" tabindex="-1">
|
<div class="dialog compare-dialog" role="dialog" aria-modal="true" aria-label="Commit comparison" tabindex="-1">
|
||||||
|
|||||||
Reference in New Issue
Block a user