Skip to content

fix: broken symlinks and pipeline variable expansion#4

Merged
jfversluis merged 1 commit into
mainfrom
fix/pipeline-errors
Mar 17, 2026
Merged

fix: broken symlinks and pipeline variable expansion#4
jfversluis merged 1 commit into
mainfrom
fix/pipeline-errors

Conversation

@jfversluis
Copy link
Copy Markdown
Member

Fixes

1. Broken symlinks causing UseDotNet@2 failure

samples/DevFlow.Sample.Linux/ had 3 symlinks pointing to ../SampleMauiApp/ (the original repo name). Fixed to point to ../DevFlow.Sample/:

  • Components../DevFlow.Sample/Components
  • Resources../DevFlow.Sample/Resources
  • wwwroot../DevFlow.Sample/wwwroot

This caused: ENOENT: no such file or directory, stat .../Components

2. Pipeline variable expansion

Template parameters need compile-time expressions (${{ variables.X }}) not runtime macros ($(X)). Runtime macros pass through as literal strings, causing display names like Build & Test ($(_ProductName) macOS) instead of Build & Test (DevFlow macOS).

Changed buildConfig, solutionFilter, and productName to use ${{ variables. }}. Left signType/sign as $() since they are conditional variables.

- Fix 3 broken symlinks in samples/DevFlow.Sample.Linux/ that pointed
  to ../SampleMauiApp/ (old name) instead of ../DevFlow.Sample/
  (Components, Resources, wwwroot). This caused UseDotNet@2 to fail
  with ENOENT when walking the directory tree.
- Use compile-time template expressions (${{ variables.X }}) instead
  of runtime macros ($(X)) when passing to template parameters.
  Runtime macros don't resolve at template expansion time, causing
  display names to show literal $(_ProductName) instead of DevFlow.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings March 17, 2026 10:25
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Fixes build failures and improves Azure Pipelines template parameter expansion by correcting sample symlink targets and using compile-time variable expressions where required.

Changes:

  • Updated broken symlink targets in samples/DevFlow.Sample.Linux/ to point to ../DevFlow.Sample/ instead of the previous repo name.
  • Switched selected extends.parameters values to compile-time expressions (${{ variables.* }}) to avoid literal runtime macro strings in template-expanded fields.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

File Description
samples/DevFlow.Sample.Linux/wwwroot Updates symlink target to the correct sample path to prevent ENOENT failures.
samples/DevFlow.Sample.Linux/Resources Updates symlink target to the correct sample path to prevent ENOENT failures.
samples/DevFlow.Sample.Linux/Components Updates symlink target to the correct sample path to prevent ENOENT failures.
eng/pipelines/devflow-official.yml Uses compile-time variable expressions for template parameters so display names and other compile-time fields expand correctly.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review. Take the survey.

@jfversluis jfversluis merged commit 614995f into main Mar 17, 2026
6 of 7 checks passed
@jfversluis jfversluis deleted the fix/pipeline-errors branch March 17, 2026 10:32
Redth added a commit that referenced this pull request Mar 29, 2026
Add GTK lifecycle hooks, font manager, and desktop integration
rmarinho added a commit that referenced this pull request Apr 30, 2026
- Remove local --dry-run option; use GlobalOptions.DryRunOption (finding #1)
- Return exit code 0 for 'skipped' status on non-macOS (finding #2)
- Wrap install action in try-catch using E2206 error code (finding #3)
- Replace null-forgiving with null-conditional on license check (finding #4)
- Defensive copy Platforms list with .ToList() (finding #5)
- Clarify cancellation limitation comment (finding #6)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
rmarinho added a commit that referenced this pull request Apr 30, 2026
- Remove local --dry-run option; use GlobalOptions.DryRunOption (finding #1)
- Return exit code 0 for 'skipped' status on non-macOS (finding #2)
- Wrap install action in try-catch using E2206 error code (finding #3)
- Replace null-forgiving with null-conditional on license check (finding #4)
- Defensive copy Platforms list with .ToList() (finding #5)
- Clarify cancellation limitation comment (finding #6)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
rmarinho added a commit that referenced this pull request Apr 30, 2026
…all command (#196)

* Refactor AppleProvider to delegate to EnvironmentChecker and add install command

- Delegate CheckHealth() to Xamarin.MacDev.EnvironmentChecker.Check() instead
  of manually querying XcodeManager/CommandLineTools/RuntimeService separately
- Add Xcode license acceptance check (new E2205 error code)
- Add SDK Platforms health check showing discovered platform SDKs
- Upgrade CLT-missing severity from Warning to Error (blocks development)
- Add 'maui apple install' command wrapping AppleInstaller.Install() for
  one-command environment bootstrapping (consistent with 'maui android install')
- Add --platform and --dry-run options to the install command
- Register AppleInstallResult in JSON source generator context
- Update FakeAppleProvider with InstallEnvironmentAsync support

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Address PR review feedback for apple install command

- Remove local --dry-run option; use GlobalOptions.DryRunOption (finding #1)
- Return exit code 0 for 'skipped' status on non-macOS (finding #2)
- Wrap install action in try-catch using E2206 error code (finding #3)
- Replace null-forgiving with null-conditional on license check (finding #4)
- Defensive copy Platforms list with .ToList() (finding #5)
- Clarify cancellation limitation comment (finding #6)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Add unit tests for 'maui apple install' command

Tests cover:
- Command structure (install exists, --platform option, no local --dry-run)
- Option parsing (multiple --platform values)
- Handler invocation via FakeAppleProvider
- Platform filter passthrough
- Global --dry-run option propagation
- Exit code 0 for 'ok' and 'skipped' status
- Exit code 1 for 'failed' status

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Address review feedback: fix docs, exit code, default platform

- Fix <returns> doc to describe AppleInstallResult (not 'environment check')
- Fix XcodeVersion doc comment to say 'version and build number' (not path)
- Return exit code 1 on non-macOS for consistent signaling
- Default --platform to iOS; add 'all' option to install all runtimes
- Add test for --platform all passing null filter to provider

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Add Apple CLI smoke test script and update instructions

- Create eng/smoke-tests/apple-cli-smoke-test.sh with 7 automated checks:
  xcode list, runtime list, simulator list, start/stop simulator,
  install dry-run (default iOS), install dry-run (all platforms)
- Update copilot-instructions.md to run smoke tests after Apple provider
  changes or Xamarin.Apple.Tools.MaciOS version updates on macOS

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Update version

* Open Simulator UI automatically on 'maui apple simulator start'

- Add --no-open flag to suppress UI launch (for CI/headless usage)
- Add OpenSimulatorApp() to IAppleProvider interface
- Implement via 'open -a Simulator' in AppleProvider
- Default behavior: boot device + open Simulator.app window

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix Apple install tests on Windows: skip handler tests on non-macOS

The install command handler returns exit code 1 on non-macOS platforms
(by design). Skip the handler-invocation tests when not running on macOS
since they test provider interaction, not the platform guard.

Command structure tests (Exists, HasPlatformOption, ParsesPlatformOption,
ParsesPlatformDefault) remain cross-platform.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@jfversluis jfversluis added this to the v0.1.0-preview.1 milestone May 6, 2026
mattleibow added a commit that referenced this pull request May 12, 2026
Critical/High fixes:
- #1: Use namespace+class for unique hint names (prevents AddSource crash
  when two pages share the same simple class name)
- #2: CrossFileResolver uses FQN lookup + ambiguity detection for
  duplicate simple names across namespaces
- #3: CollectionView conditional rendering fixed — no more [[double brackets]],
  uses unified annotation list builder
- #4: Root ContentPage walks children directly, preventing SemanticProperties
  on root from swallowing the entire page
- #5: Visibility conditions on layout containers now propagate as
  condition group wrappers ('When [visible when X = true]:')
- #6: Property-element content (ContentPage.Content, ScrollView.Content)
  no longer dropped — unknown property elements are transparent by default,
  only known non-visual ones (Resources, Triggers, etc.) are suppressed
- #7: Shell routes stored in UiElement for Shell page markdown

Medium fixes:
- #8: Promoted containers (Border with Description) now walk children too,
  preserving actionable descendants like buttons
- #9: Unresolved user controls kept as placeholders (previously dropped),
  important for third-party controls with SemanticProperties
- #10: DataTrigger with IsVisible=False setter now correctly inverted
  to 'hidden when Property = Value' instead of 'visible when'
- #11: IsVisible=False elements skipped entirely — not reachable by screen
  readers, should not appear in accessibility-first index
- #12: Aggregate namespace validated as legal C# before emitting
- #13: Always use global:: for page references in aggregate, even for
  no-namespace pages
- #14: BindingRegex now requires whitespace after 'Binding' keyword,
  preventing false matches like {BindingSource}
- #15: CrossFileResolver uses in-progress set for cycle detection,
  preventing partial cache on indirect A→B→A cycles

Low fixes:
- #16: Dead emptyViewChildren code block removed
- #17: Removed unused TemplateVariants from dead CollectionView code

104 exact-match tests, all passing.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants