Skip to content

Commit eb80bf4

Browse files
committed
Merge branch 'run-scalar-functional-tests'
Run the comprehensive Scalar Functional Tests as part of CI and PR builds. Signed-off-by: Johannes Schindelin <[email protected]>
2 parents 93b7999 + efd5b8f commit eb80bf4

File tree

2 files changed

+227
-4
lines changed

2 files changed

+227
-4
lines changed
Lines changed: 220 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,220 @@
1+
name: Scalar Functional Tests
2+
3+
env:
4+
SCALAR_REPOSITORY: microsoft/scalar
5+
SCALAR_REF: main
6+
DEBUG_WITH_TMATE: false
7+
SCALAR_TEST_SKIP_VSTS_INFO: true
8+
9+
on:
10+
push:
11+
branches: [ vfs-*, tentative/vfs-* ]
12+
pull_request:
13+
branches: [ vfs-*, features/* ]
14+
15+
jobs:
16+
scalar:
17+
name: "Scalar Functional Tests"
18+
19+
strategy:
20+
fail-fast: false
21+
matrix:
22+
# Order by runtime (in descending order)
23+
os: [windows-2019, macos-13, ubuntu-20.04, ubuntu-22.04]
24+
# Scalar.NET used to be tested using `features: [false, experimental]`
25+
# But currently, Scalar/C ignores `feature.scalar` altogether, so let's
26+
# save some electrons and run only one of them...
27+
features: [ignored]
28+
exclude:
29+
# The built-in FSMonitor is not (yet) supported on Linux
30+
- os: ubuntu-20.04
31+
features: experimental
32+
- os: ubuntu-22.04
33+
features: experimental
34+
runs-on: ${{ matrix.os }}
35+
36+
env:
37+
BUILD_FRAGMENT: bin/Release/netcoreapp3.1
38+
GIT_FORCE_UNTRACKED_CACHE: 1
39+
40+
steps:
41+
- name: Check out Git's source code
42+
uses: actions/checkout@v4
43+
44+
- name: Setup build tools on Windows
45+
if: runner.os == 'Windows'
46+
uses: git-for-windows/setup-git-for-windows-sdk@v1
47+
48+
- name: Provide a minimal `install` on Windows
49+
if: runner.os == 'Windows'
50+
shell: bash
51+
run: |
52+
test -x /usr/bin/install ||
53+
tr % '\t' >/usr/bin/install <<-\EOF
54+
#!/bin/sh
55+
56+
cmd=cp
57+
while test $# != 0
58+
do
59+
%case "$1" in
60+
%-d) cmd="mkdir -p";;
61+
%-m) shift;; # ignore mode
62+
%*) break;;
63+
%esac
64+
%shift
65+
done
66+
67+
exec $cmd "$@"
68+
EOF
69+
70+
- name: Install build dependencies for Git (Linux)
71+
if: runner.os == 'Linux'
72+
run: |
73+
sudo apt-get update
74+
sudo apt-get -q -y install libssl-dev libcurl4-openssl-dev gettext
75+
76+
- name: Build and install Git
77+
shell: bash
78+
env:
79+
NO_TCLTK: Yup
80+
run: |
81+
# We do require a VFS version
82+
def_ver="$(sed -n 's/DEF_VER=\(.*vfs.*\)/\1/p' GIT-VERSION-GEN)"
83+
test -n "$def_ver"
84+
85+
# Ensure that `git version` reflects DEF_VER
86+
case "$(git describe --match "v[0-9]*vfs*" HEAD)" in
87+
${def_ver%%.vfs.*}.vfs.*) ;; # okay, we can use this
88+
*) git -c user.name=ci -c user.email=ci@github tag -m for-testing ${def_ver}.NNN.g$(git rev-parse --short HEAD);;
89+
esac
90+
91+
SUDO=
92+
extra=
93+
case "${{ runner.os }}" in
94+
Windows)
95+
extra=DESTDIR=/c/Progra~1/Git
96+
cygpath -aw "/c/Program Files/Git/cmd" >>$GITHUB_PATH
97+
;;
98+
Linux)
99+
SUDO=sudo
100+
extra=prefix=/usr
101+
;;
102+
macOS)
103+
SUDO=sudo
104+
extra=prefix=/usr/local
105+
;;
106+
esac
107+
108+
$SUDO make -j5 $extra install
109+
110+
- name: Ensure that we use the built Git and Scalar
111+
shell: bash
112+
run: |
113+
type -p git
114+
git version
115+
case "$(git version)" in *.vfs.*) echo Good;; *) exit 1;; esac
116+
type -p scalar
117+
scalar version
118+
case "$(scalar version 2>&1)" in *.vfs.*) echo Good;; *) exit 1;; esac
119+
120+
- name: Check out Scalar's source code
121+
uses: actions/checkout@v4
122+
with:
123+
fetch-depth: 0 # Indicate full history so Nerdbank.GitVersioning works.
124+
path: scalar
125+
repository: ${{ env.SCALAR_REPOSITORY }}
126+
ref: ${{ env.SCALAR_REF }}
127+
128+
- name: Setup .NET Core
129+
uses: actions/setup-dotnet@v4
130+
with:
131+
dotnet-version: '3.1.x'
132+
133+
- name: Install dependencies
134+
run: dotnet restore
135+
working-directory: scalar
136+
env:
137+
DOTNET_NOLOGO: 1
138+
139+
- name: Build
140+
working-directory: scalar
141+
run: dotnet build --configuration Release --no-restore -p:UseAppHost=true # Force generation of executable on macOS.
142+
143+
- name: Setup platform (Linux)
144+
if: runner.os == 'Linux'
145+
run: |
146+
echo "BUILD_PLATFORM=${{ runner.os }}" >>$GITHUB_ENV
147+
echo "TRACE2_BASENAME=Trace2.${{ github.run_id }}__${{ github.run_number }}__${{ matrix.os }}__${{ matrix.features }}" >>$GITHUB_ENV
148+
149+
- name: Setup platform (Mac)
150+
if: runner.os == 'macOS'
151+
run: |
152+
echo 'BUILD_PLATFORM=Mac' >>$GITHUB_ENV
153+
echo "TRACE2_BASENAME=Trace2.${{ github.run_id }}__${{ github.run_number }}__${{ matrix.os }}__${{ matrix.features }}" >>$GITHUB_ENV
154+
155+
- name: Setup platform (Windows)
156+
if: runner.os == 'Windows'
157+
run: |
158+
echo "BUILD_PLATFORM=${{ runner.os }}" >>$env:GITHUB_ENV
159+
echo 'BUILD_FILE_EXT=.exe' >>$env:GITHUB_ENV
160+
echo "TRACE2_BASENAME=Trace2.${{ github.run_id }}__${{ github.run_number }}__${{ matrix.os }}__${{ matrix.features }}" >>$env:GITHUB_ENV
161+
162+
- name: Configure feature.scalar
163+
run: git config --global feature.scalar ${{ matrix.features }}
164+
165+
- id: functional_test
166+
name: Functional test
167+
timeout-minutes: 60
168+
working-directory: scalar
169+
shell: bash
170+
run: |
171+
export GIT_TRACE2_EVENT="$PWD/$TRACE2_BASENAME/Event"
172+
export GIT_TRACE2_PERF="$PWD/$TRACE2_BASENAME/Perf"
173+
export GIT_TRACE2_EVENT_BRIEF=true
174+
export GIT_TRACE2_PERF_BRIEF=true
175+
mkdir -p "$TRACE2_BASENAME"
176+
mkdir -p "$TRACE2_BASENAME/Event"
177+
mkdir -p "$TRACE2_BASENAME/Perf"
178+
git version --build-options
179+
cd ../out
180+
Scalar.FunctionalTests/$BUILD_FRAGMENT/Scalar.FunctionalTests$BUILD_FILE_EXT --test-scalar-on-path --test-git-on-path --timeout=300000 --full-suite
181+
182+
- name: Force-stop FSMonitor daemons and Git processes (Windows)
183+
if: runner.os == 'Windows' && (success() || failure())
184+
shell: bash
185+
run: |
186+
set -x
187+
wmic process get CommandLine,ExecutablePath,HandleCount,Name,ParentProcessID,ProcessID
188+
wmic process where "CommandLine Like '%fsmonitor--daemon %run'" delete
189+
wmic process where "ExecutablePath Like '%git.exe'" delete
190+
191+
- id: trace2_zip_unix
192+
if: runner.os != 'Windows' && ( success() || failure() ) && ( steps.functional_test.conclusion == 'success' || steps.functional_test.conclusion == 'failure' )
193+
name: Zip Trace2 Logs (Unix)
194+
shell: bash
195+
working-directory: scalar
196+
run: zip -q -r $TRACE2_BASENAME.zip $TRACE2_BASENAME/
197+
198+
- id: trace2_zip_windows
199+
if: runner.os == 'Windows' && ( success() || failure() ) && ( steps.functional_test.conclusion == 'success' || steps.functional_test.conclusion == 'failure' )
200+
name: Zip Trace2 Logs (Windows)
201+
working-directory: scalar
202+
run: Compress-Archive -DestinationPath ${{ env.TRACE2_BASENAME }}.zip -Path ${{ env.TRACE2_BASENAME }}
203+
204+
- name: Archive Trace2 Logs
205+
if: ( success() || failure() ) && ( steps.trace2_zip_unix.conclusion == 'success' || steps.trace2_zip_windows.conclusion == 'success' )
206+
uses: actions/upload-artifact@v4
207+
with:
208+
name: ${{ env.TRACE2_BASENAME }}.zip
209+
path: scalar/${{ env.TRACE2_BASENAME }}.zip
210+
retention-days: 3
211+
212+
# The GitHub Action `action-tmate` allows developers to connect to the running agent
213+
# using SSH (it will be a `tmux` session; on Windows agents it will be inside the MSYS2
214+
# environment in `C:\msys64`, therefore it can be slightly tricky to interact with
215+
# Git for Windows, which runs a slightly incompatible MSYS2 runtime).
216+
- name: action-tmate
217+
if: env.DEBUG_WITH_TMATE == 'true' && failure()
218+
uses: mxschmitt/action-tmate@v3
219+
with:
220+
limit-access-to-actor: true

diagnose.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -350,10 +350,13 @@ int create_diagnostics_archive(struct strbuf *zip_path, enum diagnose_mode mode)
350350
goto diagnose_cleanup;
351351
}
352352

353-
fprintf(stderr, "\n"
354-
"Diagnostics complete.\n"
355-
"All of the gathered info is captured in '%s'\n",
356-
zip_path->buf);
353+
strbuf_reset(&buf);
354+
strbuf_addf(&buf, "\n"
355+
"Diagnostics complete.\n"
356+
"All of the gathered info is captured in '%s'\n",
357+
zip_path->buf);
358+
write_or_die(stdout_fd, buf.buf, buf.len);
359+
write_or_die(2, buf.buf, buf.len);
357360

358361
diagnose_cleanup:
359362
if (archiver_fd >= 0) {

0 commit comments

Comments
 (0)