@@ -31,8 +31,11 @@ if [[ -n "${NX_AFFECTED_PROJECTS:-}" ]]; then
3131 read -ra AFFECTED <<< " $NX_AFFECTED_PROJECTS"
3232else
3333 echo " Source: computing from last git tag (local)"
34- NX_BASE=$( cd " $WORKSPACE_ROOT " && \
35- git describe --tags --abbrev=0 2> /dev/null || git rev-list --max-parents=0 HEAD)
34+ if NX_BASE=$( cd " $WORKSPACE_ROOT " && git describe --tags --abbrev=0 2> /dev/null) ; then
35+ true
36+ else
37+ NX_BASE=$( cd " $WORKSPACE_ROOT " && git rev-list --max-parents=0 HEAD)
38+ fi
3639 echo " Base: $NX_BASE "
3740 AFFECTED_JSON=$( cd " $WORKSPACE_ROOT " && \
3841 pnpm nx show projects --affected --base=" $NX_BASE " --json 2> /dev/null)
@@ -85,102 +88,3 @@ FILTER=$(IFS='|'; echo "${FILTER_PARTS[*]}")
8588echo " NUnit filter: $FILTER "
8689
8790dotnet test " $PROJECT_DIR " --no-build --no-restore --filter " $FILTER " " ${EXTRA_ARGS[@]} "
88-
89-
90- SCRIPT_DIR=" $( cd " $( dirname " ${BASH_SOURCE[0]} " ) " && pwd) "
91- PROJECT_DIR=" $( cd " $SCRIPT_DIR /.." && pwd) "
92- WORKSPACE_ROOT=" $( cd " $PROJECT_DIR /../.." && pwd) "
93- EXAMPLES_DIR=" $WORKSPACE_ROOT /examples"
94-
95- EXTRA_ARGS=(" $@ " )
96-
97- echo " === Example Test Runner ==="
98- echo " Project: $PROJECT_DIR "
99- echo " Workspace root: $WORKSPACE_ROOT "
100-
101- # ── 1. Get affected project list ──────────────────────────────────────────────
102-
103- if [[ -n " ${NX_AFFECTED_PROJECTS:- } " ]]; then
104- echo " Source: NX_AFFECTED_PROJECTS env var (CI)"
105- read -ra AFFECTED <<< " $NX_AFFECTED_PROJECTS"
106- else
107- echo " Source: computing from last git tag (local)"
108- NX_BASE=$( cd " $WORKSPACE_ROOT " && \
109- git describe --tags --abbrev=0 2> /dev/null || git rev-list --max-parents=0 HEAD)
110- echo " Base: $NX_BASE "
111- AFFECTED_JSON=$( cd " $WORKSPACE_ROOT " && \
112- pnpm nx show projects --affected --base=" $NX_BASE " --json 2> /dev/null)
113- read -ra AFFECTED <<< " $(node -e \
114- " process.stdout.write(JSON.parse(require(' fs' ).readFileSync(' /dev/stdin' ,' utf8' )).join(' ' ))" \
115- <<< " $AFFECTED_JSON " )"
116- fi
117-
118- echo " Affected (${# AFFECTED[@]} ): ${AFFECTED[*]:- none} "
119-
120- # ── 2. Discover example project names from disk ────────────────────────────────
121-
122- declare -A EXAMPLE_SET
123- while IFS= read -r csproj; do
124- name=" $( basename " $( dirname " $csproj " ) " ) "
125- EXAMPLE_SET[" $name " ]=1
126- done < <( find " $EXAMPLES_DIR " -name " *.csproj" \
127- -not -path " */archived/*" \
128- -not -path " */obj/*" \
129- -not -path " */bin/*" )
130-
131- echo " Discovered ${# EXAMPLE_SET[@]} example projects"
132-
133- # ── 3. Determine if any framework (src/) library is affected ──────────────────
134- # A project is a "framework library" if its root directory is under src/.
135- # This check is structural — no manual exclusion list to maintain.
136-
137- FRAMEWORK_AFFECTED=false
138- for proj in " ${AFFECTED[@]} " ; do
139- # Skip known example and test projects
140- [[ -n " ${EXAMPLE_SET[$proj]:- } " ]] && continue
141- # Ask NX for the project root
142- PROJ_ROOT=$( cd " $WORKSPACE_ROOT " && \
143- pnpm nx show project " $proj " --json 2> /dev/null | \
144- node -e " try{const d=JSON.parse(require('fs').readFileSync('/dev/stdin','utf8'));process.stdout.write(d.root||'')}catch{}" 2> /dev/null || true)
145- if [[ " $PROJ_ROOT " == src/* ]]; then
146- FRAMEWORK_AFFECTED=true
147- echo " Framework project affected: $proj ($PROJ_ROOT ) → running all examples"
148- break
149- fi
150- done
151-
152- # ── 4. Run tests ───────────────────────────────────────────────────────────────
153-
154- if [[ " $FRAMEWORK_AFFECTED " == " true" ]]; then
155- echo " Running all example integration tests."
156- dotnet test " $PROJECT_DIR " --no-build --no-restore " ${EXTRA_ARGS[@]} "
157- exit $?
158- fi
159-
160- # Intersect affected with known example names
161- AFFECTED_EXAMPLES=()
162- for proj in " ${AFFECTED[@]} " ; do
163- if [[ -n " ${EXAMPLE_SET[$proj]:- } " ]]; then
164- AFFECTED_EXAMPLES+=(" $proj " )
165- fi
166- done
167-
168- echo " Affected examples (${# AFFECTED_EXAMPLES[@]} ): ${AFFECTED_EXAMPLES[*]:- none} "
169-
170- if [[ ${# AFFECTED_EXAMPLES[@]} -eq 0 ]]; then
171- echo " No example projects affected — skipping example integration tests."
172- exit 0
173- fi
174-
175- # FUnit discovery tests are always included (fast, assertion-only).
176- # Integration tests scoped to affected examples via FullyQualifiedName.
177- FILTER_PARTS=(" Category=FUnit" )
178- for example in " ${AFFECTED_EXAMPLES[@]} " ; do
179- FILTER_PARTS+=(" FullyQualifiedName~${example} " )
180- done
181-
182- # NUnit OR operator is |
183- FILTER=$( IFS=' |' ; echo " ${FILTER_PARTS[*]} " )
184- echo " NUnit filter: $FILTER "
185-
186- dotnet test " $PROJECT_DIR " --no-build --no-restore --filter " $FILTER " " ${EXTRA_ARGS[@]} "
0 commit comments