Skip to content
Closed
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
47 changes: 47 additions & 0 deletions .github/workflows/test-e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,8 @@ jobs:
SOURCE_PACKAGES_DIR="$PWD/.ci-source-packages"
ONLY_TESTING="-only-testing:programaUITests/$TEST_FILTER"
DISPLAY_ENV_PREFIX=()
RESULT_BUNDLE_PATH="/tmp/programa-e2e.xcresult"
rm -rf "$RESULT_BUNDLE_PATH"

if [ "$TEST_FILTER" = "DisplayResolutionRegressionUITests" ]; then
HELPER_PATH="/tmp/create-virtual-display"
Expand Down Expand Up @@ -256,6 +258,7 @@ jobs:
-disableAutomaticPackageResolution
-destination "platform=macOS"
-maximum-test-execution-time-allowance "$TEST_TIMEOUT"
-resultBundlePath "$RESULT_BUNDLE_PATH"
$ONLY_TESTING
test
)
Expand Down Expand Up @@ -292,6 +295,50 @@ jobs:
exit 1
fi

- name: Capture E2E diagnostics
if: always()
run: |
set -euo pipefail
DIAGNOSTICS_DIR="/tmp/programa-e2e-diagnostics"
REPORTS_DIR="$DIAGNOSTICS_DIR/DiagnosticReports"
rm -rf "$DIAGNOSTICS_DIR"
mkdir -p "$REPORTS_DIR"

ps -axo pid=,ppid=,lstart=,state=,comm= \
| awk 'BEGIN { print "pid ppid start state executable" } /Programa|programa|xctest|XCTRunner|testmanagerd/' \
> "$DIAGNOSTICS_DIR/processes.txt"

SYSTEM_REPORTS="$HOME/Library/Logs/DiagnosticReports"
if [ -d "$SYSTEM_REPORTS" ]; then
find "$SYSTEM_REPORTS" -maxdepth 1 -type f -mmin -30 \
\( -name 'Programa*.crash' -o -name 'Programa*.ips' -o -name 'programa*.crash' -o -name 'programa*.ips' \) \
-exec cp {} "$REPORTS_DIR/" \;
fi

PROGRAMA_LOGS_DIR="$HOME/Library/Logs/Programa"
mkdir -p "$DIAGNOSTICS_DIR/ProgramaLogs"
for log_name in diagnostics.log diagnostics.log.1; do
if [ -f "$PROGRAMA_LOGS_DIR/$log_name" ]; then
cp "$PROGRAMA_LOGS_DIR/$log_name" "$DIAGNOSTICS_DIR/ProgramaLogs/$log_name"
fi
done

if [ -d /tmp/programa-e2e.xcresult ]; then
xcrun xcresulttool get test-results summary \
--path /tmp/programa-e2e.xcresult \
> "$DIAGNOSTICS_DIR/xcresult-summary.json" 2>&1 || true
fi

- name: Upload E2E diagnostics
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: programa-e2e-diagnostics-${{ github.run_id }}
path: |
/tmp/programa-e2e.xcresult
/tmp/programa-e2e-diagnostics
if-no-files-found: warn

- name: Stop recording and trim
if: ${{ always() && inputs.record_video && env.RECORD_PID != '' }}
run: |
Expand Down
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ Programa is a fork of [cmux](https://github.com/manaflow-ai/cmux); for history p
- Revoking a paired mobile device now also blocks connections still being admitted, and disabling the bridge closes active phone sessions.
- An unreadable browser history file no longer causes repeated disk reads on every omnibar keystroke.
- Clearing browser history now stays cleared after a temporary disk deletion failure or app termination.
- Launching two copies of Programa at nearly the same time now deterministically keeps the newer instance instead of allowing both processes to terminate each other. A responsive older copy bypasses only the quit-confirmation dialog and exits through the normal session-persistence path; incomplete or stale requests are ignored, and force-close remains a bounded fallback only for an unresponsive process whose identity still matches.
- Browser imports now treat Unicode domains and their Punycode forms as the same filter, so internationalized domains no longer silently import zero matching cookies or history entries.
- Socket automation no longer hangs on split Unicode requests or unsubscribe races, and malformed telemetry can no longer crash the app or grow retained workspace state without bounds.
- Large command output no longer deadlocks the CLI or background Git checks, and stalled Git probes now time out instead of accumulating work.
Expand Down
Loading
Loading