name: GnuTests # spell-checker:ignore (names) gnulib ; (utils) autopoint gperf pyinotify texinfo ; (vars) XPASS on: [push, pull_request] jobs: gnu: name: Run GNU tests runs-on: ubuntu-latest steps: - name: Checkout code uutil uses: actions/checkout@v2 with: path: 'uutils' - name: Checkout GNU coreutils uses: actions/checkout@v2 with: repository: 'coreutils/coreutils' path: 'gnu' ref: v8.32 - name: Checkout GNU coreutils library (gnulib) uses: actions/checkout@v2 with: repository: 'coreutils/gnulib' path: 'gnulib' ref: 8e99f24c0931a38880c6ee9b8287c7da80b0036b fetch-depth: 0 # gnu gets upset if gnulib is a shallow checkout - name: Install `rust` toolchain uses: actions-rs/toolchain@v1 with: toolchain: stable default: true profile: minimal # minimal component installation (ie, no documentation) components: rustfmt - name: Install dependencies shell: bash run: | ## Install dependencies sudo apt-get update sudo apt-get install autoconf autopoint bison texinfo gperf gcc g++ gdb python-pyinotify python3-sphinx jq - name: Build binaries shell: bash run: | ## Build binaries cd uutils bash util/build-gnu.sh - name: Run GNU tests shell: bash run: | bash uutils/util/run-gnu-test.sh - name: Extract testing info shell: bash run: | ## Extract testing info LOG_FILE=gnu/tests/test-suite.log if test -f "$LOG_FILE" then TOTAL=$(sed -n "s/.*# TOTAL: \(.*\)/\1/p" "$LOG_FILE"|tr -d '\r'|head -n1) PASS=$(sed -n "s/.*# PASS: \(.*\)/\1/p" "$LOG_FILE"|tr -d '\r'|head -n1) SKIP=$(sed -n "s/.*# SKIP: \(.*\)/\1/p" "$LOG_FILE"|tr -d '\r'|head -n1) FAIL=$(sed -n "s/.*# FAIL: \(.*\)/\1/p" "$LOG_FILE"|tr -d '\r'|head -n1) XPASS=$(sed -n "s/.*# XPASS: \(.*\)/\1/p" "$LOG_FILE"|tr -d '\r'|head -n1) ERROR=$(sed -n "s/.*# ERROR: \(.*\)/\1/p" "$LOG_FILE"|tr -d '\r'|head -n1) if [[ "$TOTAL" -eq 0 || "$TOTAL" -eq 1 ]]; then echo "Error in the execution, failing early" exit 1 fi output="GNU tests summary = TOTAL: $TOTAL / PASS: $PASS / FAIL: $FAIL / ERROR: $ERROR" echo "${output}" if [[ "$FAIL" -gt 0 || "$ERROR" -gt 0 ]]; then echo "::warning ::${output}" ; fi jq -n \ --arg date "$(date --rfc-email)" \ --arg sha "$GITHUB_SHA" \ --arg total "$TOTAL" \ --arg pass "$PASS" \ --arg skip "$SKIP" \ --arg fail "$FAIL" \ --arg xpass "$XPASS" \ --arg error "$ERROR" \ '{($date): { sha: $sha, total: $total, pass: $pass, skip: $skip, fail: $fail, xpass: $xpass, error: $error, }}' > gnu-result.json else echo "::error ::Failed to get summary of test results" fi - uses: actions/upload-artifact@v2 with: name: test-report path: gnu/tests/**/*.log - uses: actions/upload-artifact@v2 with: name: gnu-result path: gnu-result.json - name: Download the result uses: dawidd6/action-download-artifact@v2 with: workflow: GnuTests.yml name: gnu-result repo: uutils/coreutils branch: main path: dl - name: Download the log uses: dawidd6/action-download-artifact@v2 with: workflow: GnuTests.yml name: test-report repo: uutils/coreutils branch: main path: dl - name: Compare failing tests against main shell: bash run: | OLD_FAILING=$(sed -n "s/^FAIL: \([[:print:]]\+\).*/\1/p" dl/test-suite.log | sort) NEW_FAILING=$(sed -n "s/^FAIL: \([[:print:]]\+\).*/\1/p" gnu/tests/test-suite.log | sort) for LINE in $OLD_FAILING do if ! grep -Fxq $LINE<<<"$NEW_FAILING"; then echo "::warning ::Congrats! The gnu test $LINE is now passing!" fi done for LINE in $NEW_FAILING do if ! grep -Fxq $LINE<<<"$OLD_FAILING" then echo "::error ::GNU test failed: $LINE. $LINE is passing on 'main'. Maybe you have to rebase?" fi done - name: Compare against main results shell: bash run: | mv dl/gnu-result.json main-gnu-result.json python uutils/util/compare_gnu_result.py