Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 53 additions & 14 deletions .github/workflows/linux-app.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,17 @@
# converter's Linux binary) in activate-studio-linux-x86_64.tar.gz, with a
# manifest and a SHA-256. See docs/LINUX-APP.md.
#
# GUFI and tesseract are built from source in a Rocky Linux 9 container
# (glibc 2.34, the oldest target), so one payload runs on Ubuntu 22.04 and
# later and on RHEL 9 and later; build_app.sh then checks that no file in
# GUFI and tesseract are built from source in a Rocky Linux 8 container
# (glibc 2.28, the oldest target), so one payload runs on RHEL 8 and later
# and on Ubuntu 22.04 and later; build_app.sh then checks that no file in
# the tree needs a newer glibc. The archive is unpacked in clean Ubuntu
# 22.04, Ubuntu 24.04 and Rocky Linux 9 containers and run there as a plain
# user: indexing, search, Query, search by meaning, OCR, document
# 22.04, Ubuntu 24.04, Rocky Linux 8 and 9 and AlmaLinux 8 and 9 containers
# and run there as a plain user: indexing, search, Query, search by meaning, OCR, document
# conversion and the update check.
#
# The window shell (desktop/wails, Wails v2) is built for both WebKitGTK
# APIs, the 4.1 one on Ubuntu 22.04 (which runs on Ubuntu 24.04 too) and the
# 4.0 one on Rocky Linux 9, and goes into the tree with the launcher and the
# 4.0 one on Rocky Linux 8, and goes into the tree with the launcher and the
# install scripts (desktop/linux). From that tree come the per-user archive
# and the .deb (4.1 shell) and .rpm (4.0 shell), built with nfpm. Each
# install type is then installed in a clean container of each target
Expand Down Expand Up @@ -54,11 +54,11 @@ concurrency:
env:
# Base images for the build and the tests. Tags, not digests: the point of
# the test jobs is to run on what a person has today.
BUILD_IMAGE: rockylinux:9
BUILD_IMAGE: rockylinux:8

jobs:
# GUFI (with sqlite-vec and sqlite-lembed) and tesseract, built in a
# Rocky 9 container. They do not depend on each other, so they build side
# Rocky 8 container. They do not depend on each other, so they build side
# by side.
native:
strategy:
Expand All @@ -82,7 +82,7 @@ jobs:
with:
persist-credentials: false
ref: ${{ inputs.release }}
- name: build ${{ matrix.component }} in Rocky Linux 9
- name: build ${{ matrix.component }} in Rocky Linux 8
env:
COMPONENT: ${{ matrix.component }}
run: |
Expand Down Expand Up @@ -112,7 +112,7 @@ jobs:
- variant: wk41
image: ubuntu:22.04
- variant: wk40
image: rockylinux:9
image: rockylinux:8
runs-on: ubuntu-24.04
timeout-minutes: 30
permissions:
Expand Down Expand Up @@ -225,15 +225,46 @@ jobs:
extra_packages: ""
- image: ubuntu:24.04
extra_packages: ""
# Docker's official rockylinux:9 image is an old point release
# (9.3); the other two are current 9.x releases of the two
# rebuilds the Linux app targets.
# Docker's official rockylinux images are old point releases
# (8.9 and 9.3); the others are current releases of the two
# rebuilds the Linux app targets. The Rocky 8 images leave out
# findutils, which these checks use and the Studio does not.
- image: rockylinux:8
extra_packages: findutils
- image: rockylinux/rockylinux:8
extra_packages: findutils
- image: almalinux:8
extra_packages: ""
- image: rockylinux:9
extra_packages: ""
- image: rockylinux/rockylinux:9
extra_packages: ""
- image: almalinux:9
extra_packages: ""
# The rest of the Linux world the archive runs on. The minimal
# images leave out the tools these checks use.
- image: redhat/ubi8
extra_packages: findutils procps-ng util-linux shadow-utils
- image: redhat/ubi9
extra_packages: findutils procps-ng util-linux shadow-utils
- image: oraclelinux:8
extra_packages: findutils
- image: oraclelinux:9
extra_packages: findutils
- image: quay.io/centos/centos:stream9
extra_packages: findutils
- image: fedora:43
extra_packages: findutils procps-ng util-linux shadow-utils
- image: amazonlinux:2023
extra_packages: findutils procps-ng util-linux shadow-utils tar gzip
- image: ubuntu:20.04
extra_packages: ""
- image: debian:11
extra_packages: ""
- image: debian:12
extra_packages: ""
- image: debian:13
extra_packages: ""
runs-on: ubuntu-24.04
timeout-minutes: 30
permissions:
Expand Down Expand Up @@ -345,10 +376,18 @@ jobs:
- {image: "ubuntu:22.04", kind: deb, webkit: "", shell: wk41}
- {image: "ubuntu:24.04", kind: tarball, webkit: libwebkit2gtk-4.1-0, shell: wk41}
- {image: "ubuntu:24.04", kind: deb, webkit: "", shell: wk41}
- {image: "rockylinux/rockylinux:8", kind: tarball, webkit: webkit2gtk3, shell: wk40}
- {image: "rockylinux/rockylinux:8", kind: rpm, webkit: "", shell: wk40}
- {image: "almalinux:8", kind: tarball, webkit: webkit2gtk3, shell: wk40}
- {image: "almalinux:8", kind: rpm, webkit: "", shell: wk40}
- {image: "rockylinux/rockylinux:9", kind: tarball, webkit: webkit2gtk3, shell: wk40}
- {image: "rockylinux/rockylinux:9", kind: rpm, webkit: "", shell: wk40}
- {image: "almalinux:9", kind: tarball, webkit: webkit2gtk3, shell: wk40}
- {image: "almalinux:9", kind: rpm, webkit: "", shell: wk40}
- {image: "oraclelinux:8", kind: tarball, webkit: webkit2gtk3, shell: wk40}
- {image: "oraclelinux:8", kind: rpm, webkit: "", shell: wk40}
- {image: "debian:12", kind: tarball, webkit: libwebkit2gtk-4.1-0, shell: wk41}
- {image: "debian:12", kind: deb, webkit: "", shell: wk41}
runs-on: ubuntu-24.04
timeout-minutes: 40
permissions:
Expand Down Expand Up @@ -465,7 +504,7 @@ jobs:
--title "ACTIVATE Studio for Linux" --notes "The newest Linux app."
fi
gh release upload linux -R "$GITHUB_REPOSITORY" --clobber "${files[@]}"
gh release edit linux -R "$GITHUB_REPOSITORY" --notes "ACTIVATE Studio $TAG for Linux, x86_64, glibc 2.34 or later (Ubuntu 22.04, RHEL 9 and later).
gh release edit linux -R "$GITHUB_REPOSITORY" --notes "ACTIVATE Studio $TAG for Linux, x86_64, glibc 2.28 or later (RHEL 8, Ubuntu 22.04 and later).

A copy installed in a user's home folder updates itself from the release for its version. A copy installed from a .deb or .rpm package is updated through apt or dnf.

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ A web workspace over a folder of documents. It indexes the folder, including the

**On a Mac (Apple silicon, macOS 14 or later):** `curl -fsSL https://github.com/parallelworks/activate-studio/releases/download/macos/install.sh | bash` installs the ACTIVATE Studio app in `~/Applications`, which runs the Studio on your own folder with nothing else to install and no administrator rights, including on a managed Mac that does not allow LaunchAgents. The disk image on the [macOS release](https://github.com/parallelworks/activate-studio/releases/tag/macos) page does the same: double-click the app in it and choose Install. To remove it, choose **Uninstall ACTIVATE Studio…** in the app menu: it lists what it removes (the app, and by default its indexes, settings and logs) and never your documents. See [`docs/MACOS.md`](docs/MACOS.md).

**On Linux (x86_64, glibc 2.34 or newer):** a per-user install with no administrator rights (`activate-studio/install.sh` from the unpacked archive) or an administrator's `.deb` (Ubuntu, Debian) or `.rpm` (RHEL 9, Rocky, Alma) puts the same Studio in its own window, where WebKitGTK is installed, and in your browser where it is not. See [`docs/LINUX-APP.md`](docs/LINUX-APP.md). Test builds only for now.
**On Linux (x86_64, glibc 2.28 or newer, so RHEL 8 and 9 and their rebuilds, Ubuntu 20.04 and later, Debian 11 and later):** a per-user install with no administrator rights (`activate-studio/install.sh` from the unpacked archive) or an administrator's `.deb` (Ubuntu, Debian) or `.rpm` (RHEL, Rocky, Alma) puts the same Studio in its own window, where WebKitGTK is installed, and in your browser where it is not. See [`docs/LINUX-APP.md`](docs/LINUX-APP.md).

**On Windows:** the Studio runs in WSL2 (Windows Subsystem for Linux) and opens in a Windows browser, or a browser can open a Studio that runs on a Linux machine. There is no native Windows build. See [`docs/WINDOWS.md`](docs/WINDOWS.md).

Expand Down
14 changes: 14 additions & 0 deletions deploy/common/lib.sh
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,20 @@ fetch() {
[ "$got" = "$sum" ] || die "$file has SHA-256 $got, expected $sum"
}

# el8_tools: on RHEL 8 and its rebuilds, a compiler and a Python new enough
# for GUFI and tesseract, which GCC 8 and Python 3.6 are not, first on the
# PATH. gcc-toolset's GCC links what it adds to the C++ runtime statically, so
# the binaries still need only the system's libstdc++. Does nothing elsewhere.
el8_tools() {
[ "$(rpm -E '%{?rhel}' 2>/dev/null)" = 8 ] || return 0
dnf install -y -q --setopt=install_weak_deps=False gcc-toolset-13-gcc-c++ gcc-toolset-13-binutils python3.11 >/dev/null
set +u
# shellcheck disable=SC1091 # a file of the package just installed
. /opt/rh/gcc-toolset-13/enable
set -u
ln -sf /usr/bin/python3.11 /usr/local/bin/python3
}

# gcc_licenses DIR PREFIX: the GPL 3 and the GCC Runtime Library Exception
# into DIR, as PREFIX-COPYING3.txt and PREFIX-COPYING.RUNTIME.txt (needs
# CACHE_DIR and the pins).
Expand Down
14 changes: 7 additions & 7 deletions deploy/linux/build_app.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@
# a standalone Python for the indexer (with pypdf, xlrd and olefile for
# documents, and onnxruntime, tokenizers and numpy for the ONNX embedding
# model), and the embedding models. Build GUFI and tesseract in a Rocky
# Linux 9 container (glibc 2.34) so the tree runs on Ubuntu 22.04 and later
# and on RHEL 9 and later: this script checks that no file in the tree
# needs a newer glibc (elf_check.py).
# Linux 8 container (glibc 2.28) so the tree runs on RHEL 8 and later and on
# Ubuntu 22.04 and later: this script checks that no file in the tree needs
# a newer glibc (elf_check.py).
#
# Usage: deploy/linux/build_app.sh
# OUT_DIR where the outputs go (default deploy/linux/out)
Expand Down Expand Up @@ -51,11 +51,11 @@ TOP=activate-studio
# What only this platform pins (the rest is deploy/common/pins.sh).
NODE_SHA256=cb5c9ce9c80d7b8821e3a258543c71b939138cf17c74d5cc44bbe85d6dbc5ad8
PY_SHA256=178d3d83b6e8e99285a65d3fce9c16b87952cc5efdb4d1a0e3ff3be18ff0fc9c
# The oldest targets' libraries: RHEL 9's glibc, and the libstdc++ GCC 11
# The oldest targets' libraries: RHEL 8's glibc, and the libstdc++ GCC 8
# ships there.
MAX_GLIBC=2.34
MAX_GLIBCXX=3.4.29
MAX_CXXABI=1.3.13
MAX_GLIBC=2.28
MAX_GLIBCXX=3.4.25
MAX_CXXABI=1.3.11

[ "$(uname -s)" = Linux ] && [ "$(uname -m)" = x86_64 ] || die "builds on Linux x86_64"
for tool in python3 curl tar git pnpm patchelf; do
Expand Down
5 changes: 3 additions & 2 deletions deploy/linux/build_gufi.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
# elf_check.py: it needs no glibc newer than --max-glibc, and every library
# it loads is in the tree or one every desktop has.
#
# Build it in the oldest glibc the app supports, a Rocky Linux 9 container
# (glibc 2.34), so one tree runs on Ubuntu 22.04 and later and on RHEL 9 and
# Build it in the oldest glibc the app supports, a Rocky Linux 8 container
# (glibc 2.28), so one tree runs on RHEL 8 and later and on Ubuntu 22.04 and
# later. The build installs its tools with dnf when it finds one and runs as
# root (SKIP_DEPS=1 to skip that).
#
Expand Down Expand Up @@ -56,6 +56,7 @@ if [ "${SKIP_DEPS:-}" != 1 ] && [ "$(id -u)" = 0 ] && command -v dnf >/dev/null
util-linux attr libattr-devel diffutils patch gawk which file findutils \
autoconf automake libtool binutils zlib-devel libgomp libatomic epel-release >/dev/null
dnf install -y -q patchelf >/dev/null
el8_tools
fi
for tool in gcc g++ cmake make git curl tar patchelf python3 column setfattr readelf; do
command -v "$tool" >/dev/null 2>&1 || die "$tool is required"
Expand Down
3 changes: 2 additions & 1 deletion deploy/linux/build_ocr.sh
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
# tesseract finds its data through TESSDATA_PREFIX, which studio-run.sh sets
# to share/tessdata here.
#
# Build it in the oldest glibc the app supports, a Rocky Linux 9 container
# Build it in the oldest glibc the app supports, a Rocky Linux 8 container
# (see build_gufi.sh), which installs the tools with dnf when run as root
# (SKIP_DEPS=1 to skip that).
#
Expand Down Expand Up @@ -52,6 +52,7 @@ if [ "${SKIP_DEPS:-}" != 1 ] && [ "$(id -u)" = 0 ] && command -v dnf >/dev/null
echo "Build tools from dnf..."
dnf install -y -q --setopt=install_weak_deps=False \
gcc gcc-c++ make cmake ca-certificates tar xz python3 pkgconf-pkg-config zlib-devel file binutils >/dev/null
el8_tools
fi
for tool in gcc g++ cmake make curl tar python3 readelf; do
command -v "$tool" >/dev/null 2>&1 || die "$tool is required"
Expand Down
8 changes: 4 additions & 4 deletions deploy/linux/check_app.sh
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,9 @@ done
G="$APP/gufi"
O="$APP/ocr"
PY="$APP/python/bin/python3"
MAX_GLIBC="${MAX_GLIBC:-2.34}"
MAX_GLIBCXX="${MAX_GLIBCXX:-3.4.29}"
MAX_CXXABI="${MAX_CXXABI:-1.3.13}"
MAX_GLIBC="${MAX_GLIBC:-2.28}"
MAX_GLIBCXX="${MAX_GLIBCXX:-3.4.25}"
MAX_CXXABI="${MAX_CXXABI:-1.3.11}"
failures=0
ok() { echo " ok $1"; }
bad() { echo " FAIL $1"; failures=$((failures + 1)); }
Expand Down Expand Up @@ -117,7 +117,7 @@ PY
# The window shells and installer (desktop/linux), when the tree has them:
# a shell links to the computer's own GTK and WebKitGTK, so only its CPU and
# the newest glibc it needs are checked (a 4.1 shell is built on Ubuntu
# 22.04, so glibc 2.35; the 4.0 shell on RHEL 9, glibc 2.34).
# 22.04, so glibc 2.35; the 4.0 shell on RHEL 8, glibc 2.28).
if [ -d "$APP/bin" ]; then
echo "Desktop"
for f in bin/activate-studio bin/activate-studio-wk41 bin/activate-studio-wk40 install.sh uninstall.sh \
Expand Down
6 changes: 3 additions & 3 deletions deploy/linux/elf_check.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@
- no RUNPATH or RPATH names a directory outside --root, where the build
machine's own copy would be found on that machine and nowhere else;
- the newest glibc symbol version it needs is at most --max-glibc (the
oldest target's, 2.34 for RHEL 9), and likewise --max-glibcxx and
oldest target's, 2.28 for RHEL 8), and likewise --max-glibcxx and
--max-cxxabi for libstdc++'s versions.
It prints the newest versions across all files, and exits 1 on a problem.

Usage: elf_check.py --root DIR [--max-glibc 2.34] [--max-glibcxx 3.4.29]
[--max-cxxabi 1.3.13] [--list] FILE|DIR...
Usage: elf_check.py --root DIR [--max-glibc 2.28] [--max-glibcxx 3.4.25]
[--max-cxxabi 1.3.11] [--list] FILE|DIR...
A directory is searched for ELF files (symbolic links are not followed).
"""
import argparse
Expand Down
2 changes: 2 additions & 0 deletions deploy/linux/test_in_container.sh
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ fi
echo
echo "Dependencies"
echo " the system libraries the payload's ELF files need, and the package that provides each here:"
# Some images (Oracle Linux) ship without the linker cache.
[ -e /etc/ld.so.cache ] || ldconfig 2>/dev/null || true
for lib in $(sed -n 's/^ *"\(lib[^"]*\|ld-linux[^"]*\)",\{0,1\}$/\1/p' "$APP/manifest.json"); do
path="$(ldconfig -p | awk -v l="$lib" '$1 == l {print $NF; exit}')"
if [ -z "$path" ]; then echo " $lib: NOT FOUND"; continue; fi
Expand Down
10 changes: 5 additions & 5 deletions desktop/linux/build_packages.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
# and nothing outside it but the link, the entry and the icons.
#
# .deb the WebKitGTK 4.1 shell (Ubuntu 22.04 and later, Debian 12 and later)
# .rpm the WebKitGTK 4.0 shell (RHEL 9 and its rebuilds)
# .rpm the WebKitGTK 4.0 shell (RHEL 8 and 9 and their rebuilds)
#
# Usage: build_packages.sh ARCHIVE OUT_DIR
# Env: NFPM (the nfpm binary, default: nfpm on PATH)
Expand Down Expand Up @@ -67,8 +67,8 @@ build() {
done
local lib_deps
if [ "$fmt" = deb ]; then
# libc6 2.35: the 4.1 shell is built on Ubuntu 22.04. The rest of the
# tree needs 2.34 (libstdc++ 11 is GCC 11's, as on RHEL 9).
# libc6 2.35 and libstdc++ 11: the 4.1 shell is built on Ubuntu 22.04.
# The rest of the tree needs less (glibc 2.28, as on RHEL 8).
lib_deps=" depends:
- libwebkit2gtk-4.1-0
- libgtk-3-0t64 | libgtk-3-0
Expand All @@ -83,8 +83,8 @@ build() {
lib_deps=" depends:
- webkit2gtk3
- gtk3
- libc.so.6(GLIBC_2.34)(64bit)
- libstdc++.so.6(GLIBCXX_3.4.29)(64bit)
- libc.so.6(GLIBC_2.28)(64bit)
- libstdc++.so.6(GLIBCXX_3.4.25)(64bit)
- libgcc_s.so.1()(64bit)
- libz.so.1()(64bit)
recommends:
Expand Down
8 changes: 5 additions & 3 deletions desktop/linux/build_shell.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
#
# wk41 WebKitGTK 4.1 (libsoup 3): Ubuntu 22.04 and later, Debian 12 and
# later, Fedora. Built on Ubuntu 22.04 (glibc 2.35).
# wk40 WebKitGTK 4.0 (libsoup 2): RHEL 9 and its rebuilds, Debian 11.
# Built on Rocky Linux 9 (glibc 2.34).
# wk40 WebKitGTK 4.0 (libsoup 2): RHEL 8 and 9 and their rebuilds,
# Debian 11. Built on Rocky Linux 8 (glibc 2.28).
#
# Usage: build_shell.sh wk41|wk40
# Env: SRC (the repository, default: this script's), OUT_DIR (default /out),
Expand Down Expand Up @@ -36,7 +36,9 @@ if command -v apt-get >/dev/null 2>&1; then
apt-get install -y -qq --no-install-recommends ca-certificates curl gcc pkg-config libgtk-3-dev "$dev" >/dev/null
else
dnf -y -q install epel-release dnf-plugins-core >/dev/null
dnf config-manager --set-enabled crb
# The repository with the development packages: crb from RHEL 9 on,
# powertools on RHEL 8.
dnf config-manager --set-enabled crb 2>/dev/null || dnf config-manager --set-enabled powertools
dnf -y -q install gcc pkgconf-pkg-config tar gzip webkit2gtk3-devel gtk3-devel >/dev/null
fi

Expand Down
10 changes: 6 additions & 4 deletions desktop/linux/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
# install.sh --move move it instead of copying (no second copy on the disk)
#
# Needs WebKitGTK for the Studio's own window (libwebkit2gtk-4.1-0 on Ubuntu 22.04 and
# later, webkit2gtk3 on RHEL 9 and its rebuilds, libwebkit2gtk-4.0-37 on Debian 11); without it the
# later, webkit2gtk3 on RHEL 8 and 9 and their rebuilds, libwebkit2gtk-4.0-37 on Debian 11); without it the
# Studio opens in the default browser. A system package manager installs that;
# this script installs nothing outside your home folder.
#
Expand Down Expand Up @@ -102,9 +102,11 @@ exec_path="$BIN_DIR/activate-studio"
case "$exec_path" in *" "*) exec_path="\"$exec_path\"" ;; esac
sed "s|@BIN@|$exec_path|g" "$TREE/share/applications/activate-studio.desktop" >"$APPS_DIR/activate-studio.desktop"
if [ -d "$TREE/share/icons/hicolor" ]; then
(cd "$TREE/share/icons/hicolor" && find . -name activate-studio.png) | while IFS= read -r f; do
mkdir -p "$ICON_DIR/$(dirname "$f")"
cp "$TREE/share/icons/hicolor/$f" "$ICON_DIR/$f"
for f in "$TREE"/share/icons/hicolor/*/apps/activate-studio.png; do
[ -e "$f" ] || continue
rel="${f#"$TREE"/share/icons/hicolor/}"
mkdir -p "$ICON_DIR/$(dirname "$rel")"
cp "$f" "$ICON_DIR/$rel"
done
fi
update-desktop-database "$APPS_DIR" >/dev/null 2>&1 || true
Expand Down
5 changes: 3 additions & 2 deletions desktop/linux/test_install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ if [ $PM = deb ]; then
pm_install xvfb dbus-x11 procps imagemagick fonts-dejavu-core desktop-file-utils ca-certificates
else
dnf install -y -q epel-release >/dev/null 2>&1 || true
pm_install xorg-x11-server-Xvfb dbus-x11 dbus-daemon procps-ng ImageMagick dejavu-sans-fonts desktop-file-utils glibc-langpack-en
pm_install xorg-x11-server-Xvfb dbus-x11 dbus-daemon procps-ng findutils ImageMagick dejavu-sans-fonts desktop-file-utils glibc-langpack-en
fi
ok "Xvfb, a session bus, ImageMagick and desktop-file-utils installed"

Expand Down Expand Up @@ -287,7 +287,8 @@ if [ "$KIND" = tarball ]; then
as tester mv "$H/.local/lib/.activate-studio.new" "$R"
NEWHASH="$(sha256sum "$R/bin/activate-studio-${EXPECT_SHELL:-wk41}" | cut -d' ' -f1)"
touch "$T/up1/reopen"; chmod 666 "$T/up1/reopen"
if wait_for 120 sh -c "[ -s '$T/up1/ready' ] && [ \"\$(head -n 1 '$T/up1/ready')\" != '$OLDPID' ]"; then
# The new window removes the file as it starts, so read it once.
if wait_for 120 sh -c "p=\"\$(head -n 1 '$T/up1/ready' 2>/dev/null)\"; [ -n \"\$p\" ] && [ \"\$p\" != '$OLDPID' ]"; then
NEWPID="$(head -n 1 "$T/up1/ready")"
ok "the window reopened as a new process once the Studio drew again"
check "the old window is gone" test ! -e "/proc/$OLDPID"
Expand Down
Loading
Loading