Showing preview only (5,172K chars total). Download the full file or copy to clipboard to get everything.
Repository: rancher-sandbox/rancher-desktop
Branch: main
Commit: eb39a0cdd18a
Files: 994
Total size: 4.8 MB
Directory structure:
gitextract_qqauqqo8/
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── .yamlfmt
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yml
│ │ ├── config.yml
│ │ └── feature_request.yml
│ ├── actions/
│ │ ├── get-token/
│ │ │ └── action.yaml
│ │ ├── setup-environment/
│ │ │ └── action.yaml
│ │ ├── spelling/
│ │ │ ├── README.md
│ │ │ ├── advice.md
│ │ │ ├── allow.txt
│ │ │ ├── candidate.patterns
│ │ │ ├── excludes.txt
│ │ │ ├── expect.txt
│ │ │ ├── line_forbidden.patterns
│ │ │ ├── patterns.txt
│ │ │ └── reject.txt
│ │ └── yarn-install/
│ │ └── action.yaml
│ ├── dependabot.yml
│ └── workflows/
│ ├── bats/
│ │ ├── get-tests.py
│ │ ├── sanitize-artifact-name.sh
│ │ └── summarize.mjs
│ ├── bats.yaml
│ ├── codeql.yaml
│ ├── docker-cli-monitor.yaml
│ ├── k3s-versions.yaml
│ ├── linux-e2e.yaml
│ ├── linux-release.yaml
│ ├── macM1-e2e.yaml
│ ├── package.yaml
│ ├── paths-ignore.yaml
│ ├── rddepman.yaml
│ ├── rdx-host-api-tests.yaml
│ ├── release-merge-to-main.yaml
│ ├── scorecard.yml
│ ├── screenshot.yaml
│ ├── smoke-test/
│ │ ├── install-from-repo.sh
│ │ └── smoke-test.sh
│ ├── smoke-test.yaml
│ ├── spelling.yml
│ ├── test.yaml
│ ├── ucmonitor.yaml
│ ├── upgrade-generate.yaml
│ ├── windows-e2e.yaml
│ └── yarn-dedupe.yaml
├── .gitignore
├── .gitmodules
├── .golangci.yaml
├── .yarnrc.yml
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── babel.config.cjs
├── background.ts
├── bats/
│ ├── Makefile
│ ├── README.md
│ ├── scripts/
│ │ ├── bats-lint.pl
│ │ └── ghcr-mirror.sh
│ └── tests/
│ ├── compose/
│ │ ├── compose.bats
│ │ └── testdata/
│ │ ├── Dockerfile.nginx
│ │ ├── app/
│ │ │ ├── Dockerfile
│ │ │ ├── app.py
│ │ │ └── requirements.txt
│ │ ├── compose.yaml
│ │ └── nginx.conf
│ ├── containers/
│ │ ├── allowed-images.bats
│ │ ├── auto-start.bats
│ │ ├── catch-duplicate-api-patterns.bats
│ │ ├── docker-buildx-python3-uname.bats
│ │ ├── factory-reset-containerd-shims.bats
│ │ ├── factory-reset-snapshots.bats
│ │ ├── factory-reset.bats
│ │ ├── host-connectivity.bats
│ │ ├── host-network-ports.bats
│ │ ├── init.bats
│ │ ├── platform.bats
│ │ ├── published-ports.bats
│ │ ├── published-udp-ports.bats
│ │ ├── reset.bats
│ │ ├── run-rancher.bats
│ │ ├── split-dns-vpn.bats
│ │ ├── switch-engines.bats
│ │ ├── volumes.bats
│ │ └── wasm.bats
│ ├── extensions/
│ │ ├── allow-list.bats
│ │ ├── containers.bats
│ │ ├── install.bats
│ │ └── testdata/
│ │ ├── Dockerfile
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── basic.json
│ │ ├── bin/
│ │ │ ├── dummy.go
│ │ │ ├── dummy.sh
│ │ │ └── server.go
│ │ ├── compose.yaml
│ │ ├── everything.json
│ │ ├── host-apis.json
│ │ ├── host-binaries.json
│ │ ├── missing-icon-file.json
│ │ ├── missing-icon.json
│ │ ├── ui/
│ │ │ ├── host-apis.html
│ │ │ └── index.html
│ │ ├── ui.json
│ │ ├── vm-compose.json
│ │ └── vm-image.json
│ ├── helpers/
│ │ ├── commands.bash
│ │ ├── defaults.bash
│ │ ├── images.bash
│ │ ├── info.bash
│ │ ├── kubernetes.bash
│ │ ├── kubernetes.bats
│ │ ├── load.bash
│ │ ├── os.bash
│ │ ├── paths.bash
│ │ ├── profile.bash
│ │ ├── snapshots.bash
│ │ ├── utils.bash
│ │ ├── utils.bats
│ │ └── vm.bash
│ ├── k8s/
│ │ ├── enable-disable-k8s.bats
│ │ ├── foreach-k3s-version.bats
│ │ ├── helm-install-rancher.bats
│ │ ├── port-forwarding.bats
│ │ ├── specify-invalid-k8s-version.bats
│ │ ├── spinkube-npm.bats
│ │ ├── spinkube.bats
│ │ ├── traefik.bats
│ │ ├── up-downgrade-k8s.bats
│ │ └── wasm.bats
│ ├── preferences/
│ │ ├── move-from-roaming-to-local.bats
│ │ ├── surface-invalid-args.bats
│ │ ├── verify-paths.bats
│ │ └── verify-settings.bats
│ ├── profile/
│ │ ├── create-profile-output.bats
│ │ ├── deployment.bats
│ │ ├── invalid-locked-k8s-version.bats
│ │ └── wasm.bats
│ ├── registry/
│ │ └── creds.bats
│ ├── snapshots/
│ │ ├── create-use-snapshot.bats
│ │ ├── restore-snapshot-after-factory-reset.bats
│ │ ├── test-snapshot-list.bats
│ │ └── test_rdctl_snapshot.bats
│ └── utils/
│ ├── rdctl.bats
│ └── spin.bats
├── build/
│ ├── electron-publisher-custom.js
│ ├── license.rtf
│ ├── signing-config-mac.yaml
│ ├── signing-config-win.yaml
│ └── wix/
│ ├── dialogs.wxs
│ ├── main.wxs
│ ├── scope.wxs
│ ├── string-overrides.wxl
│ ├── verify.wxs
│ └── welcome.wxs
├── dev-app-update.yml
├── docs/
│ ├── development/
│ │ ├── README.md
│ │ ├── env.md
│ │ ├── factory-reset.md
│ │ ├── features.md
│ │ ├── linux-release-process.md
│ │ ├── obs.md
│ │ ├── release-checklist.md
│ │ └── signing.md
│ └── networking/
│ └── windows/
│ ├── README.md
│ ├── rancher-desktop-guest-agent.md
│ └── rancher-desktop-networking.md
├── e2e/
│ ├── assets/
│ │ └── k8s-deploy-sample/
│ │ └── nginx-sample-app.yaml
│ ├── backend.e2e.spec.ts
│ ├── config/
│ │ └── playwright-config.ts
│ ├── containers.e2e.spec.ts
│ ├── credentials-server.e2e.spec.ts
│ ├── extensions.e2e.spec.ts
│ ├── lockedFields.e2e.spec.ts
│ ├── main.e2e.spec.ts
│ ├── pages/
│ │ ├── container-logs-page.ts
│ │ ├── container-shell-page.ts
│ │ ├── containers-page.ts
│ │ ├── diagnostics-page.ts
│ │ ├── extensions-page.ts
│ │ ├── images-page.ts
│ │ ├── k8s-page.ts
│ │ ├── nav-page.ts
│ │ ├── portforward-page.ts
│ │ ├── preferences/
│ │ │ ├── application.ts
│ │ │ ├── containerEngine.ts
│ │ │ ├── index.ts
│ │ │ ├── kubernetes.ts
│ │ │ ├── virtualMachine.ts
│ │ │ └── wsl.ts
│ │ ├── snapshots-page.ts
│ │ ├── troubleshooting-page.ts
│ │ ├── volumes-page.ts
│ │ └── wsl-integrations-page.ts
│ ├── preferences.e2e.spec.ts
│ ├── quit-on-close.e2e.spec.ts
│ ├── rdctl.e2e.spec.ts
│ ├── start-in-background.e2e.spec.ts
│ ├── startup-profiles.e2e.spec.ts
│ ├── utils/
│ │ ├── ProfileUtils.ts
│ │ └── TestUtils.ts
│ ├── volumes.e2e.spec.ts
│ └── wsl-integrations.e2e.spec.ts
├── eslint.config.mts
├── go.work
├── jest.config.js
├── package.json
├── packaging/
│ ├── electron-builder.yml
│ └── linux/
│ ├── appimage.yml
│ ├── flatpak.yaml
│ ├── rancher-desktop.appdata.xml
│ └── rancher-desktop.spec
├── pkg/
│ └── rancher-desktop/
│ ├── assets/
│ │ ├── dependencies.yaml
│ │ ├── extension-data.yaml
│ │ ├── lima-config.yaml
│ │ ├── networks-config.yaml
│ │ ├── scripts/
│ │ │ ├── 10-flannel.conflist
│ │ │ ├── buildkit.confd
│ │ │ ├── buildkit.initd
│ │ │ ├── cert-manager.yaml
│ │ │ ├── configure-allowed-images
│ │ │ ├── docker-credential-rancher-desktop
│ │ │ ├── install-containerd-shims
│ │ │ ├── install-k3s
│ │ │ ├── install-wsl-helpers
│ │ │ ├── k3s-containerd-config.toml
│ │ │ ├── logrotate-k3s
│ │ │ ├── logrotate-lima-guestagent
│ │ │ ├── logrotate-openresty
│ │ │ ├── moproxy.initd
│ │ │ ├── nerdctl
│ │ │ ├── nginx.conf
│ │ │ ├── rancher-desktop-guestagent.initd
│ │ │ ├── service-cri-dockerd.initd
│ │ │ ├── service-k3s.initd
│ │ │ ├── service-wsl-dockerd.initd
│ │ │ ├── spin-operator.yaml
│ │ │ ├── wsl-data.conf
│ │ │ ├── wsl-exec
│ │ │ └── wsl-init
│ │ ├── specs/
│ │ │ ├── README.md
│ │ │ └── command-api.yaml
│ │ ├── styles/
│ │ │ ├── app.scss
│ │ │ ├── base/
│ │ │ │ ├── _basic.scss
│ │ │ │ ├── _color.scss
│ │ │ │ ├── _functions.scss
│ │ │ │ ├── _helpers.scss
│ │ │ │ ├── _mixins.scss
│ │ │ │ ├── _typography.scss
│ │ │ │ └── _variables.scss
│ │ │ ├── fonts/
│ │ │ │ ├── _dots.scss
│ │ │ │ ├── _fontstack.scss
│ │ │ │ ├── _icons.scss
│ │ │ │ └── _zerowidthspace.scss
│ │ │ ├── global/
│ │ │ │ ├── _button.scss
│ │ │ │ ├── _cards.scss
│ │ │ │ ├── _columns.scss
│ │ │ │ ├── _form.scss
│ │ │ │ ├── _gauges.scss
│ │ │ │ ├── _labeled-input.scss
│ │ │ │ ├── _resource.scss
│ │ │ │ ├── _select.scss
│ │ │ │ ├── _table.scss
│ │ │ │ └── _tooltip.scss
│ │ │ ├── rancher-desktop.scss
│ │ │ ├── themes/
│ │ │ │ ├── _dark.scss
│ │ │ │ ├── _light.scss
│ │ │ │ └── _suse.scss
│ │ │ └── vendor/
│ │ │ ├── normalize.scss
│ │ │ └── vue-select.scss
│ │ └── translations/
│ │ ├── en-us.yaml
│ │ └── zh-hans.yaml
│ ├── backend/
│ │ ├── __tests__/
│ │ │ ├── backendHelper.spec.ts
│ │ │ └── k3sHelper.spec.ts
│ │ ├── backend.ts
│ │ ├── backendHelper.ts
│ │ ├── containerClient/
│ │ │ ├── __tests__/
│ │ │ │ ├── auth.spec.ts
│ │ │ │ ├── client.spec.ts
│ │ │ │ └── registry.spec.ts
│ │ │ ├── auth.ts
│ │ │ ├── index.ts
│ │ │ ├── mobyClient.ts
│ │ │ ├── nerdctlClient.ts
│ │ │ ├── registry.ts
│ │ │ └── types.ts
│ │ ├── factory.ts
│ │ ├── images/
│ │ │ ├── imageFactory.ts
│ │ │ ├── imageProcessor.ts
│ │ │ ├── mobyImageProcessor.ts
│ │ │ └── nerdctlImageProcessor.ts
│ │ ├── k3sHelper.ts
│ │ ├── k8s.ts
│ │ ├── kube/
│ │ │ ├── client.ts
│ │ │ ├── lima.ts
│ │ │ └── wsl.ts
│ │ ├── kubeconfig.ts
│ │ ├── lima.ts
│ │ ├── mock.ts
│ │ ├── mock_screenshots.ts
│ │ ├── progressTracker.ts
│ │ ├── steve.ts
│ │ └── wsl.ts
│ ├── components/
│ │ ├── ActionDropdown.vue
│ │ ├── ActionMenu.vue
│ │ ├── Alert.vue
│ │ ├── AsyncButton.vue
│ │ ├── BackendProgress.vue
│ │ ├── ContainerLogs.vue
│ │ ├── ContainerShell.vue
│ │ ├── ContainerStatusBadge.vue
│ │ ├── DashboardOpen.vue
│ │ ├── DiagnosticsBody.vue
│ │ ├── DiagnosticsButtonRun.vue
│ │ ├── EmptyState.vue
│ │ ├── EngineSelector.vue
│ │ ├── ExtensionsError.vue
│ │ ├── ExtensionsUninstalled.vue
│ │ ├── Help.vue
│ │ ├── ImageAddTabs.vue
│ │ ├── Images.vue
│ │ ├── ImagesButtonAdd.vue
│ │ ├── ImagesFormAdd.vue
│ │ ├── ImagesOutputWindow.vue
│ │ ├── ImagesScanResults.vue
│ │ ├── IncompatiblePreferencesAlert.vue
│ │ ├── LoadingIndicator.vue
│ │ ├── MarketplaceCard.vue
│ │ ├── MarketplaceCatalog.vue
│ │ ├── MountTypeSelector.vue
│ │ ├── Nav.vue
│ │ ├── NavIconExtension.vue
│ │ ├── NavItem.vue
│ │ ├── NetworkStatus.vue
│ │ ├── Notifications.vue
│ │ ├── PathManagementSelector.vue
│ │ ├── PortForwarding.vue
│ │ ├── Preferences/
│ │ │ ├── Alert.vue
│ │ │ ├── ApplicationBehavior.vue
│ │ │ ├── ApplicationEnvironment.vue
│ │ │ ├── ApplicationGeneral.vue
│ │ │ ├── BodyApplication.vue
│ │ │ ├── BodyContainerEngine.vue
│ │ │ ├── BodyKubernetes.vue
│ │ │ ├── BodyVirtualMachine.vue
│ │ │ ├── BodyWsl.vue
│ │ │ ├── ButtonOpen.vue
│ │ │ ├── ContainerEngineAllowedImages.vue
│ │ │ ├── ContainerEngineGeneral.vue
│ │ │ ├── Help.vue
│ │ │ ├── ModalBody.vue
│ │ │ ├── ModalFooter.vue
│ │ │ ├── ModalHeader.vue
│ │ │ ├── ModalNav.vue
│ │ │ ├── ModalNavItem.vue
│ │ │ ├── VirtualMachineEmulation.vue
│ │ │ ├── VirtualMachineHardware.vue
│ │ │ ├── VirtualMachineVolumes.vue
│ │ │ ├── WslIntegrations.vue
│ │ │ └── WslProxy.vue
│ │ ├── RdInput.vue
│ │ ├── RdProgress.vue
│ │ ├── RdSelect.vue
│ │ ├── SnapshotCard.vue
│ │ ├── Snapshots.vue
│ │ ├── SnapshotsButtonCreate.vue
│ │ ├── SortableTable/
│ │ │ ├── THead.vue
│ │ │ ├── actions.js
│ │ │ ├── advanced-filtering.js
│ │ │ ├── debug.js
│ │ │ ├── filtering.js
│ │ │ ├── grouping.js
│ │ │ ├── index.vue
│ │ │ ├── paging.js
│ │ │ ├── selection.js
│ │ │ ├── sortable-config.ts
│ │ │ └── sorting.js
│ │ ├── StatusBar.vue
│ │ ├── StatusBarItem.vue
│ │ ├── SystemPreferences.vue
│ │ ├── Tabbed/
│ │ │ ├── RdTabbed.vue
│ │ │ ├── Tab.vue
│ │ │ └── index.vue
│ │ ├── TelemetryOptIn.vue
│ │ ├── TheTitle.vue
│ │ ├── TroubleshootingLineItem.vue
│ │ ├── UpdateStatus.vue
│ │ ├── Version.vue
│ │ ├── WSLIntegration.vue
│ │ ├── __tests__/
│ │ │ ├── BackendProgress.spec.ts
│ │ │ ├── PreferencesButton.spec.ts
│ │ │ ├── StatusBar.spec.ts
│ │ │ ├── SystemPreferences.spec.js
│ │ │ └── UpdateStatus.spec.ts
│ │ └── form/
│ │ ├── LabeledBadge.vue
│ │ ├── LabeledSelect.vue
│ │ ├── LabeledTooltip.vue
│ │ ├── RdCheckbox.vue
│ │ ├── RdFieldset.vue
│ │ ├── RdSlider.vue
│ │ ├── SplitButton.vue
│ │ ├── TextAreaAutoGrow.vue
│ │ ├── TooltipIcon.vue
│ │ ├── __tests__/
│ │ │ └── SplitButton.spec.ts
│ │ └── labeled-select-utils/
│ │ └── labeled-select-pagination.ts
│ ├── config/
│ │ ├── __tests__/
│ │ │ ├── commandLineOptions.spec.ts
│ │ │ ├── settings.spec.ts
│ │ │ └── settingsMigrations.spec.ts
│ │ ├── commandLineOptions.ts
│ │ ├── cookies.js
│ │ ├── emptyStubForJSLinter.js
│ │ ├── help.ts
│ │ ├── private-label.js
│ │ ├── query-params.js
│ │ ├── settings.ts
│ │ ├── settingsImpl.ts
│ │ ├── transientSettings.ts
│ │ └── types.js
│ ├── entry/
│ │ ├── README.md
│ │ ├── index.ts
│ │ ├── plugins.ts
│ │ ├── router.ts
│ │ └── store.ts
│ ├── hocs/
│ │ ├── README.md
│ │ └── withCredentials.ts
│ ├── index.ts
│ ├── integrations/
│ │ ├── __tests__/
│ │ │ ├── manageLinesInFile.spec.ts
│ │ │ ├── pathManager.spec.ts
│ │ │ ├── unixIntegrationManager.spec.ts
│ │ │ └── windowsIntegrationManager.spec.ts
│ │ ├── integrationManager.ts
│ │ ├── manageLinesInFile.ts
│ │ ├── pathManager.ts
│ │ ├── pathManagerImpl.ts
│ │ ├── unixIntegrationManager.ts
│ │ └── windowsIntegrationManager.ts
│ ├── layouts/
│ │ ├── default.vue
│ │ ├── dialog.vue
│ │ └── preferences.vue
│ ├── main/
│ │ ├── __tests__/
│ │ │ ├── containerExec.spec.ts
│ │ │ ├── deploymentProfiles.spec.ts
│ │ │ └── ipcMain.spec.ts
│ │ ├── commandServer/
│ │ │ ├── __tests__/
│ │ │ │ └── settingsValidator.spec.ts
│ │ │ ├── httpCommandServer.ts
│ │ │ └── settingsValidator.ts
│ │ ├── containerExec.ts
│ │ ├── credentialServer/
│ │ │ ├── README.md
│ │ │ ├── __tests__/
│ │ │ │ └── credentialUtils.spec.ts
│ │ │ ├── credentialUtils.ts
│ │ │ └── httpCredentialHelperServer.ts
│ │ ├── dashboardServer/
│ │ │ ├── index.ts
│ │ │ └── proxyUtils.ts
│ │ ├── deploymentProfiles.ts
│ │ ├── diagnostics/
│ │ │ ├── __tests__/
│ │ │ │ ├── diagnostics.spec.ts
│ │ │ │ ├── dockerCliSymlinks.spec.ts
│ │ │ │ └── rdBinInShell.spec.ts
│ │ │ ├── connectedToInternet.ts
│ │ │ ├── diagnostics.ts
│ │ │ ├── dockerCliSymlinks.ts
│ │ │ ├── dockerContext.ts
│ │ │ ├── integrationsWindows.ts
│ │ │ ├── kubeConfigSymlink.ts
│ │ │ ├── kubeContext.ts
│ │ │ ├── kubeVersionsAvailable.ts
│ │ │ ├── limaDarwin.ts
│ │ │ ├── limaOverrides.ts
│ │ │ ├── mobyImageStore.ts
│ │ │ ├── mockForScreenshots.ts
│ │ │ ├── pathManagement.ts
│ │ │ ├── rdBinInShell.ts
│ │ │ ├── testCheckers.ts
│ │ │ ├── types.ts
│ │ │ ├── wslDistros.ts
│ │ │ └── wslInfo.ts
│ │ ├── extensions/
│ │ │ ├── __tests__/
│ │ │ │ ├── extensions.spec.ts
│ │ │ │ └── manager.spec.ts
│ │ │ ├── extensions.ts
│ │ │ ├── index.ts
│ │ │ ├── manager.ts
│ │ │ └── types.ts
│ │ ├── imageEvents.ts
│ │ ├── ipcMain.ts
│ │ ├── mainEvents.ts
│ │ ├── mainmenu.ts
│ │ ├── networking/
│ │ │ ├── __tests__/
│ │ │ │ └── mac-ca.spec.ts
│ │ │ ├── cert-parse.ts
│ │ │ ├── index.ts
│ │ │ ├── linux-ca.ts
│ │ │ ├── mac-ca.ts
│ │ │ ├── proxy.ts
│ │ │ └── win-ca.ts
│ │ ├── serverHelper.ts
│ │ ├── snapshots/
│ │ │ ├── snapshots.ts
│ │ │ └── types.ts
│ │ ├── tray.ts
│ │ └── update/
│ │ ├── LonghornProvider.ts
│ │ ├── MSIUpdater.ts
│ │ ├── __tests__/
│ │ │ └── LonghornProvider.spec.ts
│ │ └── index.ts
│ ├── middleware/
│ │ ├── i18n.js
│ │ └── indexRedirect.js
│ ├── mixins/
│ │ ├── compact-input.ts
│ │ ├── labeled-form-element.ts
│ │ └── vue-select-overrides.js
│ ├── pages/
│ │ ├── Containers.vue
│ │ ├── DenyRoot.vue
│ │ ├── Diagnostics.vue
│ │ ├── Dialog.vue
│ │ ├── Extensions.vue
│ │ ├── FirstRun.vue
│ │ ├── General.vue
│ │ ├── Images.vue
│ │ ├── KubernetesError.vue
│ │ ├── PortForwarding.vue
│ │ ├── Preferences.vue
│ │ ├── Snapshots.vue
│ │ ├── SudoPrompt.vue
│ │ ├── Troubleshooting.vue
│ │ ├── UnmetPrerequisites.vue
│ │ ├── Volumes.vue
│ │ ├── containers/
│ │ │ └── ContainerInfo.vue
│ │ ├── extensions/
│ │ │ ├── _root/
│ │ │ │ └── _src/
│ │ │ │ └── _id.vue
│ │ │ └── installed.vue
│ │ ├── images/
│ │ │ ├── add.vue
│ │ │ └── scans/
│ │ │ └── _image-name.vue
│ │ ├── snapshots/
│ │ │ ├── create.vue
│ │ │ └── dialog.vue
│ │ └── volumes/
│ │ └── files/
│ │ └── _name.vue
│ ├── plugins/
│ │ ├── clean-html-directive.js
│ │ ├── clean-tooltip-directive.ts
│ │ ├── directives.js
│ │ ├── i18n.js
│ │ ├── shortkey.js
│ │ ├── tooltip.ts
│ │ ├── trim-whitespace.js
│ │ └── v-select.js
│ ├── preload/
│ │ ├── README.md
│ │ ├── extensions.ts
│ │ └── index.ts
│ ├── product.js
│ ├── public/
│ │ └── index.html
│ ├── store/
│ │ ├── action-menu.js
│ │ ├── applicationSettings.ts
│ │ ├── container-engine.ts
│ │ ├── credentials.ts
│ │ ├── diagnostics.ts
│ │ ├── extensions.ts
│ │ ├── i18n.js
│ │ ├── imageManager.ts
│ │ ├── k8sManager.js
│ │ ├── page.ts
│ │ ├── preferences.ts
│ │ ├── prefs.js
│ │ ├── resource-fetch.js
│ │ ├── snapshots.ts
│ │ ├── transientSettings.ts
│ │ └── ts-helpers.ts
│ ├── sudo-prompt/
│ │ ├── CHANGELOG.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── index.d.ts
│ │ ├── index.js
│ │ ├── package.json
│ │ ├── test-concurrent.js
│ │ └── test.js
│ ├── tsconfig.json
│ ├── types/
│ │ └── components/
│ │ └── labeledSelect.ts
│ ├── typings/
│ │ ├── assets.d.ts
│ │ ├── electron-ipc.d.ts
│ │ ├── linux-ca.d.ts
│ │ ├── rdx.d.ts
│ │ ├── shell.d.ts
│ │ ├── shims-vue.d.ts
│ │ ├── store.d.ts
│ │ ├── unix.interface.ts
│ │ └── vue-i18n.ts
│ ├── utils/
│ │ ├── DownloadProgressListener.ts
│ │ ├── __tests__/
│ │ │ ├── childProcess.spec.ts
│ │ │ ├── dockerDirManager.spec.ts
│ │ │ ├── dockerUtils.spec.ts
│ │ │ ├── iterator.spec.ts
│ │ │ ├── kubeVersions.spec.ts
│ │ │ ├── paths.spec.ts
│ │ │ └── safeRename.spec.ts
│ │ ├── array.ts
│ │ ├── backgroundProcess.ts
│ │ ├── childProcess.ts
│ │ ├── clone.ts
│ │ ├── commandLine.ts
│ │ ├── dateUtils.ts
│ │ ├── dockerDirManager.ts
│ │ ├── dockerUtils.ts
│ │ ├── dom.js
│ │ ├── environment.ts
│ │ ├── eventEmitter.ts
│ │ ├── filters.ts
│ │ ├── imageOutputCuller.ts
│ │ ├── ipcRenderer.ts
│ │ ├── iterator.ts
│ │ ├── kubeVersions.ts
│ │ ├── latch.ts
│ │ ├── logging.ts
│ │ ├── networks.ts
│ │ ├── object.js
│ │ ├── osVersion.ts
│ │ ├── paths.ts
│ │ ├── platform.js
│ │ ├── position.js
│ │ ├── processOutputInterpreters/
│ │ │ ├── __tests__/
│ │ │ │ ├── assets/
│ │ │ │ │ ├── build.txt
│ │ │ │ │ ├── pull.txt
│ │ │ │ │ ├── pull03.txt
│ │ │ │ │ ├── pull2.txt
│ │ │ │ │ ├── push.txt
│ │ │ │ │ ├── trivy-image-metric-server-input.txt
│ │ │ │ │ ├── trivy-image-metric-server-output.txt
│ │ │ │ │ ├── trivy-image-postgres-input.txt
│ │ │ │ │ └── trivy-image-postgres-output.txt
│ │ │ │ ├── image-build-output.spec.js
│ │ │ │ ├── image-non-build-output.spec.js
│ │ │ │ └── trivy-image-output.spec.js
│ │ │ ├── image-build-output.ts
│ │ │ ├── image-non-build-output.ts
│ │ │ └── trivy-image-output.ts
│ │ ├── protocols.ts
│ │ ├── resources.ts
│ │ ├── safeRename.ts
│ │ ├── select.js
│ │ ├── shortcuts.ts
│ │ ├── sort.js
│ │ ├── string-encode.ts
│ │ ├── string.js
│ │ ├── stringify.ts
│ │ ├── testUtils/
│ │ │ ├── mockModules.ts
│ │ │ ├── mockResources.ts
│ │ │ ├── setupVue.ts
│ │ │ └── vue-jest.js
│ │ ├── type-helpers.ts
│ │ ├── typeUtils.ts
│ │ ├── units.js
│ │ ├── version.ts
│ │ ├── width.js
│ │ └── wslVersion.ts
│ ├── vue.config.mjs
│ └── window/
│ ├── constants.ts
│ ├── dashboard.ts
│ ├── index.ts
│ ├── preferenceConstants.ts
│ └── preferences.ts
├── resources/
│ ├── k3s-versions.json
│ └── setup-spin
├── screenshots/
│ ├── README.md
│ ├── Screenshots.ts
│ ├── playwright-config.ts
│ ├── screenshot.ps1
│ ├── screenshots.e2e.spec.ts
│ ├── set-display-resolution.ps1
│ └── test-data/
│ ├── containers.ts
│ ├── images.ts
│ ├── preferences.ts
│ ├── snapshots.ts
│ └── volumes.ts
├── scripts/
│ ├── assets/
│ │ ├── extension-data.yaml
│ │ └── options.go.templ
│ ├── build.ts
│ ├── check-api-schema.ts
│ ├── dependencies/
│ │ ├── go-source.ts
│ │ ├── lima.ts
│ │ ├── moby-openapi.ts
│ │ ├── sudo-prompt.ts
│ │ ├── tar-archives.ts
│ │ ├── tools.ts
│ │ ├── wix.ts
│ │ └── wsl.ts
│ ├── dev.ts
│ ├── docker-cli-monitor.ts
│ ├── e2e.ts
│ ├── extension-data.ts
│ ├── generateCliCode.ts
│ ├── go-license-check.sh
│ ├── go.mod
│ ├── go.sum
│ ├── install-latest-ci.sh
│ ├── k3s-versions.go
│ ├── k3s-versions.sh
│ ├── lib/
│ │ ├── build-utils.ts
│ │ ├── dependencies.ts
│ │ ├── download.ts
│ │ ├── extension-data.ts
│ │ ├── installer-win32-gen.tsx
│ │ ├── installer-win32.tsx
│ │ ├── sign-macos.ts
│ │ └── sign-win32.ts
│ ├── lint-go.ts
│ ├── lint-typescript.ts
│ ├── package.ts
│ ├── populate-update-server.ts
│ ├── postinstall.ts
│ ├── rddepman.ts
│ ├── release-merge-to-main.ts
│ ├── sign.ts
│ ├── simple_process.ts
│ ├── spelling.sh
│ ├── ts-wrapper.js
│ ├── unreleased-change-monitor.ts
│ ├── windows/
│ │ ├── generate-nerdctl-stub.ps1
│ │ ├── install-wsl.ps1
│ │ ├── restart-helpers.ps1
│ │ ├── sudo-install-wsl.ps1
│ │ └── uninstall-wsl.ps1
│ ├── windows-setup.ps1
│ ├── wix.ts
│ └── yarn-dedupe.sh
├── src/
│ ├── go/
│ │ ├── docker-credential-none/
│ │ │ ├── dcnone/
│ │ │ │ ├── dcnone.go
│ │ │ │ ├── dcnone_test.go
│ │ │ │ └── helpers.go
│ │ │ ├── go.mod
│ │ │ ├── go.sum
│ │ │ └── main.go
│ │ ├── extension-proxy/
│ │ │ ├── README.md
│ │ │ ├── go.mod
│ │ │ └── main.go
│ │ ├── guestagent/
│ │ │ ├── README.md
│ │ │ ├── go.mod
│ │ │ ├── go.sum
│ │ │ ├── main.go
│ │ │ └── pkg/
│ │ │ ├── containerd/
│ │ │ │ ├── events_linux.go
│ │ │ │ └── events_stub.go
│ │ │ ├── docker/
│ │ │ │ └── events.go
│ │ │ ├── forwarder/
│ │ │ │ ├── forwarder.go
│ │ │ │ ├── serviceapi.go
│ │ │ │ └── wslproxy.go
│ │ │ ├── iptables/
│ │ │ │ ├── iptables.go
│ │ │ │ ├── iptables_test.go
│ │ │ │ └── scanner.go
│ │ │ ├── kube/
│ │ │ │ ├── servicewatcher_linux.go
│ │ │ │ ├── watcher_linux.go
│ │ │ │ └── watcher_stub.go
│ │ │ ├── procnet/
│ │ │ │ ├── scanner_linux.go
│ │ │ │ └── scanner_stub.go
│ │ │ ├── tracker/
│ │ │ │ ├── apitracker.go
│ │ │ │ ├── apitracker_test.go
│ │ │ │ ├── portstorage.go
│ │ │ │ └── tracker.go
│ │ │ ├── types/
│ │ │ │ ├── README.md
│ │ │ │ └── portmapping.go
│ │ │ └── utils/
│ │ │ └── utils.go
│ │ ├── mock-wsl/
│ │ │ ├── README.md
│ │ │ ├── go.mod
│ │ │ ├── go.sum
│ │ │ ├── lock_file_other.go
│ │ │ ├── lock_file_windows.go
│ │ │ ├── mock-wsl.go
│ │ │ └── schema.json
│ │ ├── nerdctl-stub/
│ │ │ ├── README.md
│ │ │ ├── command_handlers.go
│ │ │ ├── command_handlers_test.go
│ │ │ ├── debugging.go
│ │ │ ├── debugging_stub.go
│ │ │ ├── generate/
│ │ │ │ ├── README.md
│ │ │ │ ├── go.mod
│ │ │ │ ├── go.sum
│ │ │ │ ├── main_linux.go
│ │ │ │ └── main_stub.go
│ │ │ ├── go.mod
│ │ │ ├── go.sum
│ │ │ ├── main.go
│ │ │ ├── main_linux.go
│ │ │ ├── main_shared.go
│ │ │ ├── main_shared_test.go
│ │ │ ├── main_unsupported.go
│ │ │ ├── main_windows.go
│ │ │ ├── nerdctl_commands_generated.go
│ │ │ ├── parse_args.go
│ │ │ └── parse_args_test.go
│ │ ├── networking/
│ │ │ ├── .github/
│ │ │ │ └── workflows/
│ │ │ │ ├── go.yaml
│ │ │ │ └── release.yaml
│ │ │ ├── .gitignore
│ │ │ ├── LICENSE
│ │ │ ├── Makefile
│ │ │ ├── README.md
│ │ │ ├── cmd/
│ │ │ │ ├── host/
│ │ │ │ │ ├── config_windows.go
│ │ │ │ │ └── switch_windows.go
│ │ │ │ ├── network/
│ │ │ │ │ └── setup_linux.go
│ │ │ │ ├── proxy/
│ │ │ │ │ └── wsl_integration_linux.go
│ │ │ │ └── vm/
│ │ │ │ └── switch_linux.go
│ │ │ ├── go.mod
│ │ │ ├── go.sum
│ │ │ └── pkg/
│ │ │ ├── config/
│ │ │ │ └── config.go
│ │ │ ├── log/
│ │ │ │ └── log.go
│ │ │ ├── portproxy/
│ │ │ │ ├── server.go
│ │ │ │ └── server_test.go
│ │ │ ├── utils/
│ │ │ │ └── pipe.go
│ │ │ └── vsock/
│ │ │ ├── conn_windows.go
│ │ │ ├── constants.go
│ │ │ └── handshake_windows.go
│ │ ├── rdctl/
│ │ │ ├── README.md
│ │ │ ├── cmd/
│ │ │ │ ├── api.go
│ │ │ │ ├── createProfile.go
│ │ │ │ ├── enum.go
│ │ │ │ ├── extension.go
│ │ │ │ ├── extensionInstall.go
│ │ │ │ ├── extensionList.go
│ │ │ │ ├── extensionUninstall.go
│ │ │ │ ├── factoryReset.go
│ │ │ │ ├── info.go
│ │ │ │ ├── internal.go
│ │ │ │ ├── internalProcess.go
│ │ │ │ ├── internalProcessWaitKill.go
│ │ │ │ ├── listSettings.go
│ │ │ │ ├── paths.go
│ │ │ │ ├── reset.go
│ │ │ │ ├── root.go
│ │ │ │ ├── set.go
│ │ │ │ ├── setup.go
│ │ │ │ ├── shell.go
│ │ │ │ ├── shutdown.go
│ │ │ │ ├── snapshot.go
│ │ │ │ ├── snapshotCreate.go
│ │ │ │ ├── snapshotDelete.go
│ │ │ │ ├── snapshotList.go
│ │ │ │ ├── snapshotList_test.go
│ │ │ │ ├── snapshotRestore.go
│ │ │ │ ├── snapshotUnlock.go
│ │ │ │ ├── start.go
│ │ │ │ └── version.go
│ │ │ ├── go.mod
│ │ │ ├── go.sum
│ │ │ ├── main.go
│ │ │ └── pkg/
│ │ │ ├── autostart/
│ │ │ │ ├── autostart_darwin.go
│ │ │ │ ├── autostart_linux.go
│ │ │ │ └── autostart_windows.go
│ │ │ ├── client/
│ │ │ │ ├── client.go
│ │ │ │ ├── handle_unix.go
│ │ │ │ ├── handle_windows.go
│ │ │ │ └── utils.go
│ │ │ ├── command/
│ │ │ │ └── command.go
│ │ │ ├── config/
│ │ │ │ ├── config.go
│ │ │ │ └── config_test.go
│ │ │ ├── directories/
│ │ │ │ ├── directories.go
│ │ │ │ ├── directories_test.go
│ │ │ │ ├── directories_windows.go
│ │ │ │ ├── directories_windows_test.go
│ │ │ │ ├── empty.go
│ │ │ │ └── lima_home.go
│ │ │ ├── factoryreset/
│ │ │ │ ├── delete_data.go
│ │ │ │ ├── delete_data_darwin.go
│ │ │ │ ├── delete_data_linux.go
│ │ │ │ ├── delete_data_unix.go
│ │ │ │ ├── delete_data_unix_test.go
│ │ │ │ ├── delete_data_windows.go
│ │ │ │ ├── factory_reset_unix.go
│ │ │ │ └── factory_reset_windows.go
│ │ │ ├── info/
│ │ │ │ ├── ipaddress.go
│ │ │ │ ├── struct.go
│ │ │ │ └── version.go
│ │ │ ├── lima/
│ │ │ │ └── name.go
│ │ │ ├── lock/
│ │ │ │ ├── lock.go
│ │ │ │ └── mock.go
│ │ │ ├── paths/
│ │ │ │ ├── paths.go
│ │ │ │ ├── paths_darwin.go
│ │ │ │ ├── paths_darwin_test.go
│ │ │ │ ├── paths_linux.go
│ │ │ │ ├── paths_linux_test.go
│ │ │ │ ├── paths_test.go
│ │ │ │ ├── paths_unix.go
│ │ │ │ ├── paths_windows.go
│ │ │ │ └── paths_windows_test.go
│ │ │ ├── plist/
│ │ │ │ ├── plist.go
│ │ │ │ └── plist_test.go
│ │ │ ├── process/
│ │ │ │ ├── process_darwin.go
│ │ │ │ ├── process_linux.go
│ │ │ │ ├── process_test.go
│ │ │ │ ├── process_unix.go
│ │ │ │ ├── process_windows.go
│ │ │ │ └── process_windows_test.go
│ │ │ ├── reg/
│ │ │ │ ├── reg.go
│ │ │ │ └── reg_test.go
│ │ │ ├── runner/
│ │ │ │ ├── runner.go
│ │ │ │ └── runner_test.go
│ │ │ ├── shell/
│ │ │ │ └── shell.go
│ │ │ ├── shutdown/
│ │ │ │ └── shutdown.go
│ │ │ ├── snapshot/
│ │ │ │ ├── copyFile_darwin.go
│ │ │ │ ├── copyFile_linux.go
│ │ │ │ ├── manager.go
│ │ │ │ ├── manager_test.go
│ │ │ │ ├── manager_unix_test.go
│ │ │ │ ├── manager_windows_test.go
│ │ │ │ ├── snapshot.go
│ │ │ │ ├── snapshotter.go
│ │ │ │ ├── snapshotter_unix.go
│ │ │ │ └── snapshotter_windows.go
│ │ │ ├── utils/
│ │ │ │ └── utils.go
│ │ │ ├── version/
│ │ │ │ └── version.go
│ │ │ └── wsl/
│ │ │ ├── doc.go
│ │ │ ├── mock_windows.go
│ │ │ ├── names.go
│ │ │ └── wsl_windows.go
│ │ ├── spin-stub/
│ │ │ ├── README.md
│ │ │ ├── go.mod
│ │ │ └── main.go
│ │ ├── startup-profile/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── go.mod
│ │ │ ├── go.sum
│ │ │ ├── main.go
│ │ │ ├── model/
│ │ │ │ └── event.go
│ │ │ ├── parsers/
│ │ │ │ ├── const.go
│ │ │ │ ├── dmesg.go
│ │ │ │ ├── interface.go
│ │ │ │ ├── lima-ha.go
│ │ │ │ ├── lima-init.go
│ │ │ │ ├── networking.go
│ │ │ │ ├── progress.go
│ │ │ │ ├── rc.go
│ │ │ │ ├── windows-guest-agent.go
│ │ │ │ ├── windows-integration.go
│ │ │ │ └── wsl-helper.go
│ │ │ ├── rdctl/
│ │ │ │ └── rdctl.go
│ │ │ ├── render/
│ │ │ │ ├── model.go
│ │ │ │ ├── process.go
│ │ │ │ └── render.go
│ │ │ └── run.go
│ │ └── wsl-helper/
│ │ ├── .gitignore
│ │ ├── cmd/
│ │ │ ├── certificates_windows.go
│ │ │ ├── dockerproxy.go
│ │ │ ├── dockerproxy_kill_linux.go
│ │ │ ├── dockerproxy_serve_linux.go
│ │ │ ├── dockerproxy_serve_windows.go
│ │ │ ├── dockerproxy_start.go
│ │ │ ├── enum.go
│ │ │ ├── k3s.go
│ │ │ ├── k3s_kubeconfig.go
│ │ │ ├── kubeconfig.go
│ │ │ ├── process_kill_windows.go
│ │ │ ├── process_spawn_windows.go
│ │ │ ├── process_windows.go
│ │ │ ├── root.go
│ │ │ ├── version.go
│ │ │ ├── wsl.go
│ │ │ ├── wsl_info.go
│ │ │ ├── wsl_integration_docker_linux.go
│ │ │ ├── wsl_integration_linux.go
│ │ │ └── wsl_integration_state_linux.go
│ │ ├── go.mod
│ │ ├── go.sum
│ │ ├── main.go
│ │ ├── pkg/
│ │ │ ├── certificates/
│ │ │ │ ├── certificates_windows.go
│ │ │ │ └── certificates_windows_test.go
│ │ │ ├── dockerproxy/
│ │ │ │ ├── defaults.go
│ │ │ │ ├── generate.go
│ │ │ │ ├── models/
│ │ │ │ │ └── doc.go
│ │ │ │ ├── mungers/
│ │ │ │ │ ├── containers_create_linux.go
│ │ │ │ │ ├── containers_create_linux_test.go
│ │ │ │ │ ├── containers_create_windows.go
│ │ │ │ │ ├── containers_create_windows_test.go
│ │ │ │ │ ├── doc.go
│ │ │ │ │ ├── helpers.go
│ │ │ │ │ └── helpers_linux.go
│ │ │ │ ├── platform/
│ │ │ │ │ ├── hyperv.go
│ │ │ │ │ ├── hyperv_test.go
│ │ │ │ │ ├── serve_linux.go
│ │ │ │ │ ├── serve_windows.go
│ │ │ │ │ ├── serve_windows_test.go
│ │ │ │ │ ├── vsock_linux.go
│ │ │ │ │ └── wsl_mountpoint_linux.go
│ │ │ │ ├── serve.go
│ │ │ │ ├── start.go
│ │ │ │ ├── swagger-configuration.yaml
│ │ │ │ └── util/
│ │ │ │ ├── pipe.go
│ │ │ │ ├── pipe_test.go
│ │ │ │ ├── reverse_proxy.go
│ │ │ │ └── reverse_proxy_test.go
│ │ │ ├── integration/
│ │ │ │ ├── docker_linux.go
│ │ │ │ ├── docker_linux_test.go
│ │ │ │ └── integration.go
│ │ │ ├── process/
│ │ │ │ ├── imports_windows.go
│ │ │ │ ├── kill_others_linux.go
│ │ │ │ ├── kill_windows.go
│ │ │ │ ├── run_windows.go
│ │ │ │ └── wait_windows.go
│ │ │ ├── version/
│ │ │ │ └── version.go
│ │ │ └── wsl-utils/
│ │ │ ├── doc.go
│ │ │ ├── install_windows.go
│ │ │ ├── run_windows.go
│ │ │ ├── version_windows.go
│ │ │ └── version_windows_test.go
│ │ └── wix/
│ │ ├── check_windows.go
│ │ ├── doc.go
│ │ ├── helpers_windows.go
│ │ ├── imports_windows.go
│ │ ├── install_windows.go
│ │ └── main_windows.go
│ └── sudo-prompt/
│ ├── build-sudo-prompt
│ ├── sudo-prompt-script
│ └── sudo-prompt.applescript
└── tsconfig.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .editorconfig
================================================
# EditorConfig helps developers define and maintain consistent
# coding styles between different editors and IDEs
# editorconfig.org
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 2
indent_style = space
insert_final_newline = true
quote_type = single
trim_trailing_whitespace = true
[*.go]
indent_style = tab
[*.{sh,bash,bats}]
indent_size = 4
simplify = true
================================================
FILE: .gitattributes
================================================
# All Linux scripts should have LF line endings
# But only text files should be changed (not any binaries / images / etc.)
resources/linux/** text=auto eol=lf
resources/setup-spin text=auto eol=lf
pkg/rancher-desktop/assets/scripts/** text=auto eol=lf
================================================
FILE: .github/.yamlfmt
================================================
formatter:
indentless_arrays: true
retain_line_breaks: true
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: Bug Report
description: Report Rancher Desktop issue
labels: ["kind/bug"]
body:
- type: textarea
attributes:
label: Actual Behavior
description: "A clear and concise description of what the bug is."
validations:
required: true
- type: textarea
attributes:
label: Steps to Reproduce
description: "Please, describe the steps to reproduce the behaviour."
validations:
required: true
- type: textarea
attributes:
label: Result
description: "Please, show what error or behaviour you're seeing."
validations:
required: true
- type: textarea
attributes:
label: Expected Behavior
description: "A clear and concise description of what you expected to happen."
validations:
required: true
- type: textarea
attributes:
label: Additional Information
description: >-
Add any other context about the problem here. Please make sure to excerpt
or attach logs. Include screenshots if appropriate, but they are not a
replacement for logs.
- type: input
attributes:
label: Rancher Desktop Version
description: "What version of Rancher Desktop are you using?"
placeholder: "e.g. 1.1.1"
validations:
required: true
- type: input
attributes:
label: Rancher Desktop K8s Version
description: "What version of Kubernetes are you using?"
placeholder: "e.g. 1.99.9"
validations:
required: true
- type: dropdown
attributes:
label: "Which container engine are you using?"
options:
- containerd (nerdctl)
- moby (docker cli)
validations:
required: true
- type: dropdown
attributes:
label: "What operating system are you using?"
options:
- macOS
- Windows
- Ubuntu
- Other Linux
- Other (specify below)
validations:
required: true
- type: input
attributes:
label: Operating System / Build Version
description: "What operating system and build version are you using?"
placeholder: "e.g. Windows 10 Home 1909, macOS Monterey 12.0.1, Ubuntu 20.04, etc..."
validations:
required: true
- type: dropdown
attributes:
label: What CPU architecture are you using?
options:
- x64
- ia32
- arm64 (Apple Silicon)
validations:
required: true
- type: dropdown
attributes:
label: "Linux only: what package format did you use to install Rancher Desktop?"
options:
- N/A
- deb
- rpm
- AppImage
- Flatpak
validations:
required: false
- type: textarea
attributes:
label: Windows User Only
description: "Are you using VPN, Proxy, Special Firewall rules, Security Software or custom Activity directory features? if Yes, please describe."
placeholder: "e.g. VPN PulseSecure, Kaspersky Total Security 21.2.x, custom proxy configs, activity directory features, or N/A"
validations:
required: false
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: true
contact_links:
- name: Ask a question (GitHub Discussions)
url: https://github.com/rancher-sandbox/rancher-desktop/discussions
about: We use GitHub Discussions for questions and GitHub issues for tracking bug reports and feature requests
- name: Chat with Rancher Desktop users and developers
url: https://slack.rancher.io/
about: We hang out in the `#rancher-desktop` channel in the Rancher Users slack
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: Feature Request
description: "Suggest a feature or idea to Rancher Desktop."
labels: ["kind/enhancement"]
body:
- type: textarea
attributes:
label: Problem Description
description: "A clear and concise description of what enhancement you'd like."
validations:
required: true
- type: textarea
attributes:
label: Proposed Solution
description: "Describe the solution you'd like in a clear and concise manner."
validations:
required: true
- type: textarea
attributes:
label: Additional Information
description: "Add any other context/information about the problem here."
validations:
required: false
================================================
FILE: .github/actions/get-token/action.yaml
================================================
name: Get Token
description: >-
This action attempts to get a token with the requested permissions; if this is
not running from the upstream repository, it attempts to get the token from a
secret. Otherwise, it uses the vault actions.
This requires permissions set described in
https://github.com/rancher-eio/read-vault-secrets
inputs:
token-secret:
description: Secret to fall back to
required: false
outputs:
token:
description: The GitHub token retrieved
value: ${{ github.repository == 'rancher-sandbox/rancher-desktop' && steps.gen-token.outputs.token || steps.get-secret.outputs.token }}
runs:
using: composite
steps:
- id: vault
name: Read vault secrets
if: github.repository == 'rancher-sandbox/rancher-desktop'
uses: rancher-eio/read-vault-secrets@main
with:
secrets: |
secret/data/github/repo/${{ github.repository }}/github/app-credentials appId | APP_ID ;
secret/data/github/repo/${{ github.repository }}/github/app-credentials privateKey | PRIVATE_KEY
- id: gen-token
name: Generate token
if: github.repository == 'rancher-sandbox/rancher-desktop'
uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1
with:
app-id: ${{ env.APP_ID }}
private-key: ${{ env.PRIVATE_KEY }}
- id: get-secret
name: Fetch secret.
if: github.repository != 'rancher-sandbox/rancher-desktop'
run: echo "token=$SECRET" >> "$GITHUB_OUTPUT"
shell: bash
env:
SECRET: ${{ inputs.token-secret }}
================================================
FILE: .github/actions/setup-environment/action.yaml
================================================
name: Setup Environment
description: >-
This is a composite action that is used to set up the runner for running
Rancher Desktop.
inputs:
user:
default: ''
description: >-
(Linux only) The user to use to set up `pass`
runs:
using: composite
steps:
- name: "Windows: Stop unwanted services"
if: runner.os == 'Windows'
shell: pwsh
run: >-
Get-Service -ErrorAction Continue -Name
@('W3SVC', 'docker')
| Stop-Service
- name: "Windows: Update any pre-installed WSL"
if: runner.os == 'Windows'
shell: pwsh
run: |
# Sometimes this results in a HTTP 403 for some reason; in that case, we
# need to retry.
do {
wsl --update
} while ( -not $? )
# Setting the default version also lets WSL finish updating.
wsl --set-default-version 2
- name: "Windows: Install yq"
if: runner.os == 'Windows'
shell: bash
run: |
set -o xtrace
bindir="$HOME/bin"
if [[ ! "$PATH" =~ "$bindir" ]]; then
bindir=/usr/bin
fi
if ! command -v yq; then
mkdir -p "$bindir"
curl --location --output "$bindir/yq.exe" \
https://github.com/mikefarah/yq/releases/download/v4.43.1/yq_windows_amd64.exe
chmod a+x "$bindir/yq.exe"
fi
- name: "Linux: Determine whether sudo is required"
if: runner.os == 'Linux'
shell: bash
id: sudo
run: |
if [[ $(id --user) -eq 0 ]]; then
echo "sudo=command" >> "$GITHUB_OUTPUT"
# Fix for https://github.com/rocky-linux/sig-cloud-instance-images/issues/56
chmod u+r /etc/shadow
else
echo "sudo=sudo" >> "$GITHUB_OUTPUT"
fi
- name: "Linux: Enable KVM access"
if: runner.os == 'Linux'
shell: bash
run: ${{ steps.sudo.outputs.sudo }} chmod a+rwx /dev/kvm
- name: "Linux: Set unprivileged port start to 80"
if: runner.os == 'Linux'
shell: bash
run: >-
${{ steps.sudo.outputs.sudo }}
sh -c
'echo 80 > /proc/sys/net/ipv4/ip_unprivileged_port_start'
- name: "Linux: Install required packages"
if: runner.os == 'Linux'
shell: bash
run: |
source /etc/os-release
for id in $ID $ID_LIKE; do
case $id in
suse|opensuse)
${{ steps.sudo.outputs.sudo }} zypper --non-interactive install \
fuse gawk git GraphicsMagick gtk3-tools jq mozilla-nss \
noto-sans-fonts password-store sudo xvfb-run xauth which
if [[ ${GITHUB_JOB:-unknown} =~ appimage ]]; then
${{ steps.sudo.outputs.sudo }} zypper --non-interactive install \
libasound2 openssh-clients
fi
exit 0;;
rocky|rhel|centos|fedora)
if [[ "$id" != "fedora" ]]; then
${{ steps.sudo.outputs.sudo }} dnf install --assumeyes \
"https://dl.fedoraproject.org/pub/epel/epel-release-latest-${VERSION_ID%%.*}.noarch.rpm"
${{ steps.sudo.outputs.sudo }} /usr/bin/crb enable # spellcheck-ignore-line
fi
${{ steps.sudo.outputs.sudo }} dnf install --assumeyes \
at-spi2-atk cups-libs git GraphicsMagick gtk3 jq \
libva nss pass procps-ng sudo xorg-x11-server-Xvfb \
/usr/bin/script \
--setopt=excludepkgs=systemd-standalone-tmpfiles
exit 0;;
debian|ubuntu)
${{ steps.sudo.outputs.sudo }} apt-get update
${{ steps.sudo.outputs.sudo }} apt-get install --verbose-versions --yes \
curl jq pass sudo xvfb
exit 0;;
esac
done
printf "Could not find known distribution in [%s %s]\n" "$ID" "$ID_LIKE" >&2
exit 1
- name: "Linux: Set up passwordless sudo"
if: runner.os == 'Linux'
shell: bash
run: |
case "$TARGET_USER" in
""|root)
exit 0;;
esac
echo "$TARGET_USER ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/$TARGET_USER
env:
TARGET_USER: ${{ inputs.user || 'root' }}
- name: "Linux: Initialize pass"
if: runner.os == 'Linux'
shell: >-
/usr/bin/sudo --user=${{ inputs.user || 'root' }}
--login --set-home --non-interactive bash {0}
run: |
# Configure the agent to allow default passwords
HOMEDIR="$(gpgconf --list-dirs homedir)" # spellcheck-ignore-line
mkdir -p "${HOMEDIR}"
chmod 0700 "${HOMEDIR}"
echo "allow-preset-passphrase" >> "${HOMEDIR}/gpg-agent.conf"
# Create a GPG key
gpg --quick-generate-key --yes --batch --passphrase '' \
user@rancher-desktop.test default \
default never
# Get info about the newly created key
DATA="$(gpg --batch --with-colons --with-keygrip --list-secret-keys)"
FINGERPRINT="$(awk -F: '/^fpr:/ { print $10 ; exit }' <<< "${DATA}")" # spellcheck-ignore-line
GRIP="$(awk -F: '/^grp:/ { print $10 ; exit }' <<< "${DATA}")"
# Save the password
gpg-connect-agent --verbose "PRESET_PASSPHRASE ${GRIP} -1 00" /bye
# Initialize pass
pass init "${FINGERPRINT}"
================================================
FILE: .github/actions/spelling/README.md
================================================
# check-spelling/check-spelling configuration
File | Purpose | Format | Info
---- | ------- | ------ | ----
[dictionary.txt](dictionary.txt) | Replacement dictionary (creating this file will override the default dictionary) | one word per line | [dictionary](https://github.com/check-spelling/check-spelling/wiki/Configuration#dictionary)
[allow.txt](allow.txt) | Add words to the dictionary | one word per line (only letters and `'`s allowed) | [allow](https://github.com/check-spelling/check-spelling/wiki/Configuration#allow)
[reject.txt](reject.txt) | Remove words from the dictionary (after allow) | grep pattern matching whole dictionary words | [reject](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-reject)
[excludes.txt](excludes.txt) | Files to ignore entirely | perl regular expression | [excludes](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-excludes)
[only.txt](only.txt) | Only check matching files (applied after excludes) | perl regular expression | [only](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-only)
[patterns.txt](patterns.txt) | Patterns to ignore from checked lines | perl regular expression (order matters, first match wins) | [patterns](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-patterns)
[candidate.patterns](candidate.patterns) | Patterns that might be worth adding to [patterns.txt](patterns.txt) | perl regular expression with optional comment block introductions (all matches will be suggested) | [candidates](https://github.com/check-spelling/check-spelling/wiki/Feature:-Suggest-patterns)
[line_forbidden.patterns](line_forbidden.patterns) | Patterns to flag in checked lines | perl regular expression (order matters, first match wins) | [patterns](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-patterns)
[expect.txt](expect.txt) | Expected words that aren't in the dictionary | one word per line (sorted, alphabetically) | [expect](https://github.com/check-spelling/check-spelling/wiki/Configuration#expect)
[advice.md](advice.md) | Supplement for GitHub comment when unrecognized words are found | GitHub Markdown | [advice](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-advice)
Note: you can replace any of these files with a directory by the same name (minus the suffix)
and then include multiple files inside that directory (with that suffix) to merge multiple files together.
================================================
FILE: .github/actions/spelling/advice.md
================================================
<!-- See https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-advice --> <!-- markdownlint-disable MD033 MD041 -->
<details><summary>If the flagged items are :exploding_head: false positives</summary>
If items relate to a ...
* binary file (or some other file you wouldn't want to check at all).
Please add a file path to the `excludes.txt` file matching the containing file.
File paths are Perl 5 Regular Expressions - you can [test](
https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your files.
`^` refers to the file's path from the root of the repository, so `^README\.md$` would exclude [README.md](
../tree/HEAD/README.md) (on whichever branch you're using).
* well-formed pattern.
If you can write a [pattern](
https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-patterns
) that would match it,
try adding it to the `patterns.txt` file.
Patterns are Perl 5 Regular Expressions - you can [test](
https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your lines.
Note that patterns can't match multiline strings.
</details>
<!-- adoption information-->
:steam_locomotive: If you're seeing this message and your PR is from a branch that doesn't have check-spelling,
please merge to your PR's base branch to get the version configured for your repository.
================================================
FILE: .github/actions/spelling/allow.txt
================================================
emoji
github
https
passwordless
ssh
ubuntu
workarounds
================================================
FILE: .github/actions/spelling/candidate.patterns
================================================
# Repeated letters
\b([A-Za-z])\g{-1}{2,}\b
# marker to ignore all code on line
^.*/\* #no-spell-check-line \*/.*$
# marker to ignore all code on line
^.*\bno-spell-check(?:-line|)(?:\s.*|)$
# https://cspell.org/configuration/document-settings/
# cspell inline
^.*\b[Cc][Ss][Pp][Ee][Ll]{2}:\s*[Dd][Ii][Ss][Aa][Bb][Ll][Ee]-[Ll][Ii][Nn][Ee]\b
# copyright
Copyright (?:\([Cc]\)|)(?:[-\d, ]|and)+(?: [A-Z][a-z]+ [A-Z][a-z]+,?)+
# patch hunk comments
^@@ -\d+(?:,\d+|) \+\d+(?:,\d+|) @@ .*
# git index header
index (?:[0-9a-z]{7,40},|)[0-9a-z]{7,40}\.\.[0-9a-z]{7,40}
# file permissions
['"`\s](?!-+\s)[-bcdLlpsw](?:[-r][-w][-Ssx]){2}[-r][-w][-SsTtx]\+?['"`\s]
# css fonts
\bfont(?:-family(?:[-\w+]*)|):[^;}]+
# css url wrappings
\burl\([^)]+\)
# cid urls
(['"])cid:.*?\g{-1}
# data url in parens
\(data:(?:[^) ][^)]*?|)(?:[A-Z]{3,}|[A-Z][a-z]{2,}|[a-z]{3,})[^)]*\)
# data url in quotes
([`'"])data:(?:[^ `'"].*?|)(?:[A-Z]{3,}|[A-Z][a-z]{2,}|[a-z]{3,}).*\g{-1}
# data url
\bdata:[-a-zA-Z=;:/0-9+_]*,\S*
# https/http/file urls
(?:\b(?:https?|ftp|file)://)[-A-Za-z0-9+&@#/*%?=~_|!:,.;]+[-A-Za-z0-9+&@#/*%=~_|]
# mailto urls
mailto:[-a-zA-Z=;:/?%&0-9+@._]{3,}
# magnet urls
magnet:[?=:\w]+
# magnet urls
"magnet:[^"]+"
# obs:
"obs:[^"]*"
# The `\b` here means a break, it's the fancy way to handle urls, but it makes things harder to read
# In this examples content, I'm using a number of different ways to match things to show various approaches
# asciinema
\basciinema\.org/a/[0-9a-zA-Z]+
# asciinema v2
^\[\d+\.\d+, "[io]", ".*"\]$
# apple
\bdeveloper\.apple\.com/[-\w?=/]+
# Apple music
\bembed\.music\.apple\.com/fr/playlist/usr-share/[-\w.]+
# appveyor api
\bci\.appveyor\.com/api/projects/status/[0-9a-z]+
# appveyor project
\bci\.appveyor\.com/project/(?:[^/\s"]*/){2}builds?/\d+/job/[0-9a-z]+
# Amazon
# Amazon
\bamazon\.com/[-\w]+/(?:dp/[0-9A-Z]+|)
# AWS ARN
arn:aws:[-/:\w]+
# AWS S3
\b\w*\.s3[^.]*\.amazonaws\.com/[-\w/&#%_?:=]*
# AWS execute-api
\b[0-9a-z]{10}\.execute-api\.[-0-9a-z]+\.amazonaws\.com\b
# AWS ELB
\b\w+\.[-0-9a-z]+\.elb\.amazonaws\.com\b
# AWS SNS
\bsns\.[-0-9a-z]+.amazonaws\.com/[-\w/&#%_?:=]*
# AWS VPC
vpc-\w+
# While you could try to match `http://` and `https://` by using `s?` in `https?://`, sometimes there
# YouTube url
\b(?:(?:www\.|)youtube\.com|youtu.be)/(?:channel/|embed/|user/|playlist\?list=|watch\?v=|v/|)[-a-zA-Z0-9?&=_%]*
# YouTube music
\bmusic\.youtube\.com/youtubei/v1/browse(?:[?&]\w+=[-a-zA-Z0-9?&=_]*)
# YouTube tag
<\s*youtube\s+id=['"][-a-zA-Z0-9?_]*['"]
# YouTube image
\bimg\.youtube\.com/vi/[-a-zA-Z0-9?&=_]*
# Google Accounts
\baccounts.google.com/[-_/?=.:;+%&0-9a-zA-Z]*
# Google Analytics
\bgoogle-analytics\.com/collect.[-0-9a-zA-Z?%=&_.~]*
# Google APIs
\bgoogleapis\.(?:com|dev)/[a-z]+/(?:v\d+/|)[a-z]+/[-@:./?=\w+|&]+
# Google Artifact Registry
\.pkg\.dev(?:/[-\w]+)+(?::[-\w]+|)
# Google Storage
\b[-a-zA-Z0-9.]*\bstorage\d*\.googleapis\.com(?:/\S*|)
# Google Calendar
\bcalendar\.google\.com/calendar(?:/u/\d+|)/embed\?src=[@./?=\w&%]+
\w+\@group\.calendar\.google\.com\b
# Google DataStudio
\bdatastudio\.google\.com/(?:(?:c/|)u/\d+/|)(?:embed/|)(?:open|reporting|datasources|s)/[-0-9a-zA-Z]+(?:/page/[-0-9a-zA-Z]+|)
# The leading `/` here is as opposed to the `\b` above
# ... a short way to match `https://` or `http://` since most urls have one of those prefixes
# Google Docs
/docs\.google\.com/[a-z]+/(?:ccc\?key=\w+|(?:u/\d+|d/(?:e/|)[0-9a-zA-Z_-]+/)?(?:edit\?[-\w=#.]*|/\?[\w=&]*|))
# Google Drive
\bdrive\.google\.com/(?:file/d/|open)[-0-9a-zA-Z_?=]*
# Google Groups
\bgroups\.google\.com(?:/[a-z]+/(?:#!|)[^/\s"]+)*
# Google Maps
\bmaps\.google\.com/maps\?[\w&;=]*
# Google themes
themes\.googleusercontent\.com/static/fonts/[^/\s"]+/v\d+/[^.]+.
# Google CDN
\bclients2\.google(?:usercontent|)\.com[-0-9a-zA-Z/.]*
# Goo.gl
/goo\.gl/[a-zA-Z0-9]+
# Google Chrome Store
\bchrome\.google\.com/webstore/detail/[-\w]*(?:/\w*|)
# Google Books
\bgoogle\.(?:\w{2,4})/books(?:/\w+)*\?[-\w\d=&#.]*
# Google Fonts
\bfonts\.(?:googleapis|gstatic)\.com/[-/?=:;+&0-9a-zA-Z]*
# Google Forms
\bforms\.gle/\w+
# Google Scholar
\bscholar\.google\.com/citations\?user=[A-Za-z0-9_]+
# Google Colab Research Drive
\bcolab\.research\.google\.com/drive/[-0-9a-zA-Z_?=]*
# Google Cloud regions
(?:us|(?:north|south)america|europe|asia|australia|me|africa)-(?:north|south|east|west|central){1,2}\d+
# GitHub SHAs (api)
\bapi.github\.com/repos(?:/[^/\s"]+){3}/[0-9a-f]+\b
# GitHub SHAs (markdown)
(?:\[`?[0-9a-f]+`?\]\(https:/|)/(?:www\.|)github\.com(?:/[^/\s"]+){2,}(?:/[^/\s")]+)(?:[0-9a-f]+(?:[-0-9a-zA-Z/#.]*|)\b|)
# GitHub SHAs
\bgithub\.com(?:/[^/\s"]+){2}[@#][0-9a-f]+\b
# GitHub SHA refs
\[([0-9a-f]+)\]\(https://(?:www\.|)github.com/[-\w]+/[-\w]+/commit/\g{-1}[0-9a-f]*
# GitHub wiki
\bgithub\.com/(?:[^/]+/){2}wiki/(?:(?:[^/]+/|)_history|[^/]+(?:/_compare|)/[0-9a-f.]{40,})\b
# githubusercontent
/[-a-z0-9]+\.githubusercontent\.com/[-a-zA-Z0-9?&=_\/.]*
# githubassets
\bgithubassets.com/[0-9a-f]+(?:[-/\w.]+)
# gist github
\bgist\.github\.com/[^/\s"]+/[0-9a-f]+
# git.io
\bgit\.io/[0-9a-zA-Z]+
# GitHub JSON
"node_id": "[-a-zA-Z=;:/0-9+_]*"
# Contributor
\[[^\]]+\]\(https://github\.com/[^/\s"]+/?\)
# GHSA
GHSA(?:-[0-9a-z]{4}){3}
# GitHub actions
\buses:\s+(['"]?)[-\w.]+/[-\w./]+@[-\w.]+\g{-1}
# GitLab commit
\bgitlab\.[^/\s"]*/\S+/\S+/commit/[0-9a-f]{7,16}#[0-9a-f]{40}\b
# GitLab merge requests
\bgitlab\.[^/\s"]*/\S+/\S+/-/merge_requests/\d+/diffs#[0-9a-f]{40}\b
# GitLab uploads
\bgitlab\.[^/\s"]*/uploads/[-a-zA-Z=;:/0-9+]*
# GitLab commits
\bgitlab\.[^/\s"]*/(?:[^/\s"]+/){2}commits?/[0-9a-f]+\b
# #includes
^\s*#include\s*(?:<.*?>|".*?")
# #pragma lib
^\s*#pragma comment\(lib, ".*?"\)
# binance
accounts\.binance\.com/[a-z/]*oauth/authorize\?[-0-9a-zA-Z&%]*
# bitbucket diff
\bapi\.bitbucket\.org/\d+\.\d+/repositories/(?:[^/\s"]+/){2}diff(?:stat|)(?:/[^/\s"]+){2}:[0-9a-f]+
# bitbucket repositories commits
\bapi\.bitbucket\.org/\d+\.\d+/repositories/(?:[^/\s"]+/){2}commits?/[0-9a-f]+
# bitbucket commits
\bbitbucket\.org/(?:[^/\s"]+/){2}commits?/[0-9a-f]+
# bit.ly
\bbit\.ly/\w+
# bitrise
\bapp\.bitrise\.io/app/[0-9a-f]*/[\w.?=&]*
# bootstrapcdn.com
\bbootstrapcdn\.com/[-./\w]+
# cdn.cloudflare.com
\bcdnjs\.cloudflare\.com/[./\w]+
# circleci
\bcircleci\.com/gh(?:/[^/\s"]+){1,5}.[a-z]+\?[-0-9a-zA-Z=&]+
# gitter
\bgitter\.im(?:/[^/\s"]+){2}\?at=[0-9a-f]+
# gravatar
\bgravatar\.com/avatar/[0-9a-f]+
# ibm
[a-z.]*ibm\.com/[-_#=:%!?~.\\/\d\w]*
# imgur
\bimgur\.com/[^.]+
# Internet Archive
\barchive\.org/web/\d+/(?:[-\w.?,'/\\+&%$#_:]*)
# discord
/discord(?:app\.com|\.gg)/(?:invite/)?[a-zA-Z0-9]{7,}
# Disqus
\bdisqus\.com/[-\w/%.()!?&=_]*
# medium link
\blink\.medium\.com/[a-zA-Z0-9]+
# medium
\bmedium\.com/@?[^/\s"]+/[-\w]+
# microsoft
\b(?:https?://|)(?:(?:(?:blogs|download\.visualstudio|docs|msdn2?|research)\.|)microsoft|blogs\.msdn)\.co(?:m|\.\w\w)/[-_a-zA-Z0-9()=./%]*
# powerbi
\bapp\.powerbi\.com/reportEmbed/[^"' ]*
# vs devops
\bvisualstudio.com(?::443|)/[-\w/?=%&.]*
# microsoft store
\bmicrosoft\.com/store/apps/\w+
# mvnrepository.com
\bmvnrepository\.com/[-0-9a-z./]+
# now.sh
/[0-9a-z-.]+\.now\.sh\b
# oracle
\bdocs\.oracle\.com/[-0-9a-zA-Z./_?#&=]*
# chromatic.com
/\S+.chromatic.com\S*[")]
# codacy
\bapi\.codacy\.com/project/badge/Grade/[0-9a-f]+
# compai
\bcompai\.pub/v1/png/[0-9a-f]+
# mailgun api
\.api\.mailgun\.net/v3/domains/[0-9a-z]+\.mailgun.org/messages/[0-9a-zA-Z=@]*
# mailgun
\b[0-9a-z]+.mailgun.org
# /message-id/
/message-id/[-\w@./%]+
# Reddit
\breddit\.com/r/[/\w_]*
# requestb.in
\brequestb\.in/[0-9a-z]+
# sched
\b[a-z0-9]+\.sched\.com\b
# Slack url
slack://[a-zA-Z0-9?&=]+
# Slack
\bslack\.com/[-0-9a-zA-Z/_~?&=.]*
# Slack edge
\bslack-edge\.com/[-a-zA-Z0-9?&=%./]+
# Slack images
\bslack-imgs\.com/[-a-zA-Z0-9?&=%.]+
# shields.io
\bshields\.io/[-\w/%?=&.:+;,]*
# stackexchange -- https://stackexchange.com/feeds/sites
\b(?:askubuntu|serverfault|stack(?:exchange|overflow)|superuser).com/(?:questions/\w+/[-\w]+|a/)
# Sentry
[0-9a-f]{32}\@o\d+\.ingest\.sentry\.io\b
# Twitter markdown
\[@[^[/\]:]*?\]\(https://twitter.com/[^/\s"')]*(?:/status/\d+(?:\?[-_0-9a-zA-Z&=]*|)|)\)
# Twitter hashtag
\btwitter\.com/hashtag/[\w?_=&]*
# Twitter status
\btwitter\.com/[^/\s"')]*(?:/status/\d+(?:\?[-_0-9a-zA-Z&=]*|)|)
# Twitter profile images
\btwimg\.com/profile_images/[_\w./]*
# Twitter media
\btwimg\.com/media/[-_\w./?=]*
# Twitter link shortened
\bt\.co/\w+
# facebook
\bfburl\.com/[0-9a-z_]+
# facebook CDN
\bfbcdn\.net/[\w/.,]*
# facebook watch
\bfb\.watch/[0-9A-Za-z]+
# dropbox
\bdropbox\.com/sh?/[^/\s"]+/[-0-9A-Za-z_.%?=&;]+
# ipfs protocol
ipfs://[0-9a-zA-Z]{3,}
# ipfs url
/ipfs/[0-9a-zA-Z]{3,}
# w3
\bw3\.org/[-0-9a-zA-Z/#.]+
# loom
\bloom\.com/embed/[0-9a-f]+
# regex101
\bregex101\.com/r/[^/\s"]+/\d+
# figma
\bfigma\.com/file(?:/[0-9a-zA-Z]+/)+
# freecodecamp.org
\bfreecodecamp\.org/[-\w/.]+
# image.tmdb.org
\bimage\.tmdb\.org/[/\w.]+
# mermaid
\bmermaid\.ink/img/[-\w]+|\bmermaid-js\.github\.io/mermaid-live-editor/#/edit/[-\w]+
# Wikipedia
\ben\.wikipedia\.org/wiki/[-\w%.#]+
# gitweb
[^"\s]+/gitweb/\S+;h=[0-9a-f]+
# HyperKitty lists
/archives/list/[^@/]+@[^/\s"]*/message/[^/\s"]*/
# lists
/thread\.html/[^"\s]+
# list-management
\blist-manage\.com/subscribe(?:[?&](?:u|id)=[0-9a-f]+)+
# kubectl.kubernetes.io/last-applied-configuration
"kubectl.kubernetes.io/last-applied-configuration": ".*"
# pgp
\bgnupg\.net/pks/lookup[?&=0-9a-zA-Z]*
# Spotify
\bopen\.spotify\.com/embed/playlist/\w+
# Mastodon
\bmastodon\.[-a-z.]*/(?:media/|@)[?&=0-9a-zA-Z_]*
# scastie
\bscastie\.scala-lang\.org/[^/]+/\w+
# images.unsplash.com
\bimages\.unsplash\.com/(?:(?:flagged|reserve)/|)[-\w./%?=%&.;]+
# pastebin
\bpastebin\.com/[\w/]+
# heroku
\b\w+\.heroku\.com/source/archive/\w+
# quip
\b\w+\.quip\.com/\w+(?:(?:#|/issues/)\w+)?
# badgen.net
\bbadgen\.net/badge/[^")\]'\s]+
# statuspage.io
\w+\.statuspage\.io\b
# media.giphy.com
\bmedia\.giphy\.com/media/[^/]+/[\w.?&=]+
# tinyurl
\btinyurl\.com/\w+
# codepen
\bcodepen\.io/[\w/]+
# registry.npmjs.org
\bregistry\.npmjs\.org/(?:@[^/"']+/|)[^/"']+/-/[-\w@.]+
# getopts
\bgetopts\s+(?:"[^"]+"|'[^']+')
# ANSI color codes
(?:\\(?:u00|x)1[Bb]|\\03[1-7]|\x1b|\\u\{1[Bb]\})\[\d+(?:;\d+)*m
# URL escaped characters
%[0-9A-F][A-F](?=[A-Za-z])
# lower URL escaped characters
#%[0-9a-f][a-f](?=[a-z]{2,})
# IPv6
\b(?:[0-9a-fA-F]{0,4}:){3,7}[0-9a-fA-F]{0,4}\b
# c99 hex digits (not the full format, just one I've seen)
0x[0-9a-fA-F](?:\.[0-9a-fA-F]*|)[pP]
# Punycode
\bxn--[-0-9a-z]+
# sha
sha\d+:[0-9a-f]*?[a-f]{3,}[0-9a-f]*
# sha-... -- uses a fancy capture
(\\?['"]|")[0-9a-f]{40,}\g{-1}
# hex runs
\b(?=(?:[a-fA-F]{0,2}\d)*[a-fA-F]{3})[0-9a-fA-F]{16,}\b
# hex in url queries
=[0-9a-fA-F]*?(?:[A-F]{3,}|[a-f]{3,})[0-9a-fA-F]*?&
# ssh
(?:ssh-\S+|-nistp256) [-a-zA-Z=;:/0-9+]{12,}
# PGP
\b(?:[0-9A-F]{4} ){9}[0-9A-F]{4}\b
# GPG keys
\b(?:[0-9A-F]{4} ){5}(?: [0-9A-F]{4}){5}\b
# Well known gpg keys
.well-known/openpgpkey/[\w./]+
# pki
-----BEGIN.*-----END
# pki (base64)
LS0tLS1CRUdJT.*
# C# includes
^\s*using [^;]+;
# uuid:
\b[0-9a-fA-F]{8}-(?:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}\b
# hex digits including css/html color classes:
(?:[\\0][xX]|\\u\{?|[uU]\+|#x?|%23|&H)[0-9_a-fA-FgGrR]*?[a-fA-FgGrR]{2,}[0-9_a-fA-FgGrR]*(?:[uUlL]{0,3}|[iu]\d+)\b
# integrity
integrity=(['"])(?:\s*sha\d+-[-a-zA-Z=;:/0-9+]{40,})+\g{-1}
# https://www.gnu.org/software/groff/manual/groff.html
# man troff content
\\f[BCIPR]
# '/"
\\\([ad]q
# .desktop mime types
^MimeTypes?=.*$
# .desktop localized entries
^[A-Z][a-z]+\[[a-z]+\]=.*$
# Localized .desktop content
Name\[[^\]]+\]=.*
# IServiceProvider / isAThing
#(?:(?:\b|_|(?<=[a-z]))I|(?:\b|_)(?:nsI|isA))(?=(?:[A-Z][a-z]{2,})+(?:[A-Z\d]|\b))
# python
\b(?i)py(?!gments|gmy|lon|ramid|ro|th)(?=[a-z]{2,})
# crypt
(['"])\$2[ayb]\$.{56}\g{-1}
# apache/old crypt
(['"]|)\$+(?:apr|)1\$+.{8}\$+.{22}\g{-1}
# sha1 hash
\{SHA\}[-a-zA-Z=;:/0-9+]{3,}
# machine learning (?)
\b(?i)ml(?=[a-z]{2,})
# scrypt / argon
\$(?:scrypt|argon\d+[di]*)\$\S+
# go.sum
\bh1:\S+
# golang print-f-style functions
(?i)(?<=append|comma|debug|equal|err|error|exit|fatal|format|info|log|name|panic|print|skip|scan|string|trace|true|warn|warning|wrap|write)(?:f|ln)[ (]
# golang regular expression
(?<!")\br".+?"
# imports
^import\s+(?:(?:static|type)\s+|)(?:[\w.]|\{\s*\w*?(?:,\s*(?:\w*|\*))+\s*\})+(?:\s+from (['"]).*?\g{-1}|)
# scala modules
("[^"]+"\s*%%?\s*){2,3}"[^"]+"
# Dataframes / NumPy
\b(?:df|np)\.\w{3,}
# container images
image: [-\w./:@]+
# Docker images
^\s*(?i)FROM\s+\S+:\S+(?:\s+AS\s+\S+|)
# `docker images` REPOSITORY TAG IMAGE ID CREATED SIZE
\s*\S+/\S+\s+\S+\s+[0-9a-f]{8,}\s+\d+\s+(?:hour|day|week)s ago\s+[\d.]+[KMGT]B
# Intel intrinsics
_mm\d*_(?!dd)\w+
# Input to GitHub JSON
content: (['"])[-a-zA-Z=;:/0-9+]*=\g{-1}
# This does not cover multiline strings, if your repository has them,
# you'll want to remove the `(?=.*?")` suffix.
# The `(?=.*?")` suffix should limit the false positives rate
# printf
%(?:(?:(?:hh?|ll?|[jzt])?[diuoxn]|l?[cs]|L?[fega]|p)(?=[a-z]{2,})|(?:X|L?[FEGA])(?=[a-zA-Z]{2,}))(?!%)(?=[_a-zA-Z]+(?!%)\b)(?=.*?['"])
# Alternative printf
# %s
%(?:s(?=[a-z]{2,}))(?!%)(?=[_a-zA-Z]+(?!%[^s])\b)(?=.*?['"])
# Python string prefix / binary prefix
# Note that there's a high false positive rate, remove the `?=` and search for the regex to see if the matches seem like reasonable strings
(?<!['"])\b(?:B|BR|Br|F|FR|Fr|R|RB|RF|Rb|Rf|U|UR|Ur|b|bR|br|f|fR|fr|r|rB|rF|rb|rf|u|uR|ur)['"](?=[A-Z]{3,}|[A-Z][a-z]{2,}|[a-z]{3,})
# Regular expression for word breaks
#\\b(?=[a-z]{2})
# Regular expressions for (P|p)assword
\([A-Z]\|[a-z]\)[a-z]+
# JavaScript regular expressions
# javascript exec/test regex
/.{3,}?/[gim]*\.(?:exec|test)\(
# javascript match regex
\.match\(/[^/\s"]{3,}/[gim]*\s*
# javascript match regex
\.match\(/\\[b].{3,}?/[gim]*\s*\)(?:;|$)
# javascript regex
^\s*/\\[b].{3,}?/[gim]*\s*(?:\)(?:;|$)|,$)
# javascript replace regex
\.replace\(/[^/\s"]{3,}/[gim]*\s*,
# assign regex
= /[^*].*?(?:[a-z]{3,}|[A-Z]{3,}|[A-Z][a-z]{2,}).*/[gim]*(?=\W|$)
# perl regex test
[!=]~ (?:/.*/|m\{.*?\}|m<.*?>|m([|!/@#,;']).*?\g{-1})
# perl qr regex
(?<!\$)\bqr(?:\{.*?\}|<.*?>|\(.*?\)|([|!/@#,;']).*?\g{-1})
# perl run
perl(?:\s+-[a-zA-Z]\w*)+
# C network byte conversions
(?:\d|\bh)to(?!ken)(?=[a-z])|to(?=[adhiklpun]\()
# Go regular expressions
regexp?\.MustCompile\((?:`[^`]*`|".*"|'.*')\)
# regex choice
\((?:\?:|)[^)|]+(?<! )\|(?!(?:jq|xargs)\b)[^)| ][^)]*\)
# proto
^\s*(\w+)\s\g{-1} =
# sed regular expressions
sed 's/(?:[^/]*?[a-zA-Z]{3,}[^/]*?/){2}
# node packages
(["'])@[^/'" ]+/[^/'" ]+\g{-1}
# go install
go install(?:\s+[a-z]+\.[-@\w/.]+)+
# pom.xml
<(?:group|artifact)Id>.*?<
# jetbrains schema https://youtrack.jetbrains.com/issue/RSRP-489571
urn:shemas-jetbrains-com
# Debian changelog severity
[-\w]+ \(.*\) (?:\w+|baseline|unstable|experimental); urgency=(?:low|medium|high|emergency|critical)\b
# kubernetes pod status lists
# https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-phase
\w+(?:-\w+)+\s+\d+/\d+\s+(?:Running|Pending|Succeeded|Failed|Unknown)\s+
# kubectl - pods in CrashLoopBackOff
\w+-[0-9a-f]+-\w+\s+\d+/\d+\s+CrashLoopBackOff\s+
# kubernetes applications
\.apps/[-\w]+
# kubernetes object suffix
-[0-9a-f]{10}-\w{5}\s
# kubernetes crd patterns
^\s*pattern: .*$
# posthog secrets
([`'"])phc_[^"',]+\g{-1}
# xcode
# xcodeproject scenes
(?:Controller|destination|(?:first|second)Item|ID|id)="\w{3}-\w{2}-\w{3}"
# xcode api botches
customObjectInstantitationMethod
# msvc api botches
PrependWithABINamepsace
# configure flags
.* \| --\w{2,}.*?(?=\w+\s\w+)
# font awesome classes
\.fa-[-a-z0-9]+
# bearer auth
(['"])[Bb]ear[e][r] .{3,}?\g{-1}
# bearer auth
\b[Bb]ear[e][r]:? [-a-zA-Z=;:/0-9+.]{3,}
# basic auth
(['"])[Bb]asic [-a-zA-Z=;:/0-9+]{3,}\g{-1}
# basic auth
: [Bb]asic [-a-zA-Z=;:/0-9+.]{3,}
# base64 encoded content
#([`'"])[-a-zA-Z=;:/0-9+]{3,}=\g{-1}
# base64 encoded content in xml/sgml
>[-a-zA-Z=;:/0-9+]{3,}=</
# base64 encoded content, possibly wrapped in mime
#(?:^|[\s=;:?])[-a-zA-Z=;:/0-9+]{50,}(?:[\s=;:?]|$)
# base64 encoded json
\beyJ[-a-zA-Z=;:/0-9+]+
# base64 encoded pkcs
\bMII[-a-zA-Z=;:/0-9+]+
# uuencoded
#[!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_]{40,}
# DNS rr data
(?:\d+\s+){3}(?:[-+/=.\w]{2,}\s*){1,2}
# encoded-word
=\?[-a-zA-Z0-9"*%]+\?[BQ]\?[^?]{0,75}\?=
# numerator
\bnumer\b(?=.*denom)
# Time Zones
\b(?:Africa|Atlantic|America|Antarctica|Arctic|Asia|Australia|Europe|Indian|Pacific)(?:/[-\w]+)+
# linux kernel info
^(?:bugs|flags|Features)\s+:.*
# systemd mode
systemd.*?running in system mode \([-+].*\)$
# Lorem
# Update Lorem based on your content (requires `ge` and `w` from https://github.com/jsoref/spelling; and `review` from https://github.com/check-spelling/check-spelling/wiki/Looking-for-items-locally )
# grep '^[^#].*lorem' .github/actions/spelling/patterns.txt|perl -pne 's/.*i..\?://;s/\).*//' |tr '|' "\n"|sort -f |xargs -n1 ge|perl -pne 's/^[^:]*://'|sort -u|w|sed -e 's/ .*//'|w|review -
# Warning, while `(?i)` is very neat and fancy, if you have some binary files that aren't proper unicode, you might run into:
# ... Operation "substitution (s///)" returns its argument for non-Unicode code point 0x1C19AE (the code point will vary).
# ... You could manually change `(?i)X...` to use `[Xx]...`
# ... or you could add the files to your `excludes` file (a version after 0.0.19 should identify the file path)
(?:(?:\w|\s|[,.])*\b(?i)(?:amet|consectetur|cursus|dolor|eros|ipsum|lacus|libero|ligula|lorem|magna|neque|nulla|suscipit|tempus)\b(?:\w|\s|[,.])*)
# Non-English
# Even repositories expecting pure English content can unintentionally have Non-English content... People will occasionally mistakenly enter [homoglyphs](https://en.wikipedia.org/wiki/Homoglyph) which are essentially typos, and using this pattern will mean check-spelling will not complain about them.
# .
# If the content to be checked should be written in English and the only Non-English items will be people's names, then you can consider adding this.
# .
# Alternatively, if you're using check-spelling v0.0.25+, and you would like to _check_ the Non-English content for spelling errors, you can. For information on how to do so, see:
# https://docs.check-spelling.dev/Feature:-Configurable-word-characters.html#unicode
[a-zA-Z]*[ÀÁÂÃÄÅÆČÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæčçèéêëìíîïðñòóôõöøùúûüýÿĀāŁłŃńŅņŒœŚśŠšŜŝŸŽžź][a-zA-Z]{3}[a-zA-ZÀÁÂÃÄÅÆČÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæčçèéêëìíîïðñòóôõöøùúûüýÿĀāŁłŃńŅņŒœŚśŠšŜŝŸŽžź]*|[a-zA-Z]{3,}[ÀÁÂÃÄÅÆČÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæčçèéêëìíîïðñòóôõöøùúûüýÿĀāŁłŃńŅņŒœŚśŠšŜŝŸŽžź]|[ÀÁÂÃÄÅÆČÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæčçèéêëìíîïðñòóôõöøùúûüýÿĀāŁłŃńŅņŒœŚśŠšŜŝŸŽžź][a-zA-Z]{3,}
# highlighted letters
\[[A-Z]\][a-z]+
# French
# This corpus only had capital letters, but you probably want lowercase ones as well.
\b[LN]'+[a-z]{2,}\b
# latex (check-spelling >= 0.0.22)
\\\w{2,}\{
# American Mathematical Society (AMS) / Doxygen
TeX/AMS
# File extensions
\*\.[+\w]+,
# eslint
"varsIgnorePattern": ".+"
# nolint
nolint:\s*[\w,]+
# Windows short paths
[/\\][^/\\]{5,6}~\d{1,2}(?=[/\\])
# Windows Resources with accelerators
\b[A-Z]&[a-z]+\b(?!;)
# signed off by
(?i)Signed-off-by: .*
# cygwin paths
/cygdrive/[a-zA-Z]/(?:Program Files(?: \(.*?\)| ?)(?:/[-+.~\\/()\w ]+)*|[-+.~\\/()\w])+
# in check-spelling@v0.0.22+, printf markers aren't automatically consumed
# printf markers
#(?<!\\)\\[nrt](?=[a-z]{2,})
# alternate printf markers if you run into latex and friends
#(?<!\\)\\[nrt](?=[a-z]{2,})(?=.*['"`])
# Markdown anchor links
\(#\S*?[a-zA-Z]\S*?\)
# apache
a2(?:en|dis)
# weak e-tag
W/"[^"]+"
# authors/credits
^\*(?: [A-Z](?:\w+|\.)){2,} (?=\[|$)
# the negative lookahead here is to allow catching 'templatesz' as a misspelling
# but to otherwise recognize a Windows path with \templates\foo.template or similar:
\\(?:necessary|r(?:elease|eport|esolve[dr]?|esult)|t(?:arget|emplates?))(?![a-z])
# ignore long runs of a single character:
\b([A-Za-z])\g{-1}{3,}\b
# version suffix <word>v#
(?:(?<=[A-Z]{2})V|(?<=[a-z]{2}|[A-Z]{2})v)\d+(?:\b|(?=[a-zA-Z_]))
# Compiler flags (Unix, Java/Scala)
# Use if you have things like `-Pdocker` and want to treat them as `docker`
#(?:^|[\t ,>"'`=(#])-(?:(?:J-|)[DPWXY]|[Llf])(?=[A-Z]{2,}|[A-Z][a-z]|[a-z]{2,})
# Compiler flags (Windows / PowerShell)
# This is a subset of the more general compiler flags pattern.
# It avoids matching `-Path` to prevent it from being treated as `ath`
#(?:^|[\t ,"'`=(#])-(?:[DPL](?=[A-Z]{2,})|[WXYlf](?=[A-Z]{2,}|[A-Z][a-z]|[a-z]{2,}))
# Compiler flags (linker)
,-B
# Library prefix
# e.g., `lib`+`archive`, `lib`+`raw`, `lib`+`unwind`
# (ignores some words that happen to start with `lib`)
(?:\b|_)[Ll]ib(?!era[lt])(?:re(?=office)|era|)(?!ero|erty|rar(?:i(?:an|es)|y))(?=[a-z])
# iSCSI iqn (approximate regex)
\biqn\.[0-9]{4}-[0-9]{2}(?:[\.-][a-z][a-z0-9]*)*\b
# WWNN/WWPN (NAA identifiers)
\b(?:0x)?10[0-9a-f]{14}\b|\b(?:0x|3)?[25][0-9a-f]{15}\b|\b(?:0x|3)?6[0-9a-f]{31}\b
# curl arguments
\b(?:\\n|)curl(?:\.exe|)(?:\s+-[a-zA-Z]{1,2}\b)*(?:\s+-[a-zA-Z]{3,})(?:\s+-[a-zA-Z]+)*
# set arguments
\b(?:bash|sh|set)(?:\s+[-+][abefimouxE]{1,2})*\s+[-+][abefimouxE]{3,}(?:\s+[-+][abefimouxE]+)*
# tar arguments
\b(?:\\n|)g?tar(?:\.exe|)(?:\s-C \S+|(?:\s+--[-a-zA-Z]+|\s+-[a-zA-Z]+|\s[ABGJMOPRSUWZacdfh-pr-xz]+\b)(?:=[^ ]*|))+
# tput arguments -- https://man7.org/linux/man-pages/man5/terminfo.5.html -- technically they can be more than 5 chars long...
\btput\s+(?:(?:-[SV]|-T\s*\w+)\s+)*\w{3,5}\b
# macOS temp folders
/var/folders/\w\w/[+\w]+/(?:T|-Caches-)/
# github runner temp folders
/home/runner/work/_temp/[-_/a-z0-9]+
================================================
FILE: .github/actions/spelling/excludes.txt
================================================
# See https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-excludes
(?:^|/)(?i)COPYRIGHT
(?:^|/)(?i)LICEN[CS]E
(?:^|/)(?i)third[-_]?party/
(?:^|/)3rdparty/
(?:^|/)generated/
(?:^|/)go\.(?:work\.)?sum$
(?:^|/)package(?:-lock|)\.json$
(?:^|/)Pipfile$
(?:^|/)pyproject.toml
(?:^|/)vendor/
(?:^|/|\b)requirements(?:-dev|-doc|-test|)\.txt$
-lock\.yaml$
\.a$
\.ai$
\.all-contributorsrc$
\.avi$
\.bmp$
\.bz2$
\.cert?$|\.crt$
\.class$
\.coveragerc$
\.crl$
\.csr$
\.dll$
\.docx?$
\.drawio$
\.DS_Store$
\.eot$
\.eps$
\.exe$
\.gif$
\.git-blame-ignore-revs$
\.gitattributes$
\.gitkeep$
\.graffle$
\.gz$
\.icns$
\.ico$
\.ipynb$
\.jar$
\.jks$
\.jpe?g$
\.key$
\.kiwi$
\.lib$
\.lock$
\.map$
\.min\..
\.mo$
\.mod$
\.mp[34]$
\.o$
\.ocf$
\.otf$
\.p12$
\.parquet$
\.pdf$
\.pem$
\.pfx$
\.png$
\.psd$
\.pyc$
\.pylintrc$
\.qm$
\.s$
\.sig$
\.so$
\.svgz?$
\.sys$
\.tar$
\.tgz$
\.tiff?$
\.ttf$
\.wav$
\.webm$
\.webp$
\.woff2?$
\.xcf$
\.xlsx?$
\.xpm$
\.xz$
\.zip$
^\.github/actions/spelling/
^\Q.github/workflows/spelling.yml\E$
^\Qpkg/rancher-desktop/assets/styles/fonts/_dots.scss\E$
^\Qpkg/rancher-desktop/assets/styles/fonts/_zerowidthspace.scss\E$
^\Qpkg/rancher-desktop/utils/processOutputInterpreters/__tests__/assets/build.txt\E$
^\Qpkg/rancher-desktop/utils/processOutputInterpreters/__tests__/assets/pull03.txt\E$
^\Qpkg/rancher-desktop/utils/processOutputInterpreters/__tests__/assets/push.txt\E$
^\QSECURITY.md\E$
^pkg/rancher-desktop/assets/scripts/logrotate-k3s$
^pkg/rancher-desktop/assets/scripts/logrotate-lima-guestagent$
^pkg/rancher-desktop/sudo-prompt/
^pkg/rancher-desktop/utils/processOutputInterpreters/__tests__/assets/trivy-image-postgres
ignore$
/translations/(?!en)
^\Qpkg/rancher-desktop/router.js\E$
^\Qsrc/go/nerdctl-stub/nerdctl_commands_generated.go\E$
^\Q.golangci.yaml\E$
^\Qsrc/go/networking/.golangci.yml\E$
# Generated file
^\Qpkg/rancher-desktop/assets/extension-data.yaml\E$
# Mostly image names
^\Qscripts/assets/extension-data.yaml\E$
# Test data
^screenshots/test-data/
================================================
FILE: .github/actions/spelling/expect.txt
================================================
abbrv
actionmenu
ACTIONSTART
activedirectory
addexclusion
addext
addgroup
addlabel
addrepo
adfs
adrg
airgap
aks
alertmanager
alibaba
aliyun
aliyunecs
aliyunkubernetescontainerservice
allcols
allusers
ALLPLATFORMS
altgraph
andsection
apierrors
apify
apiservice
apitracker
APPDIR
appimage
appimagekit
APPLEID
applescript
APPLICATIONFOLDER
ARPNOMODIFY
ARPPRODUCTICON
ARPURLINFOABOUT
arrowdown
arrowleft
arrowright
arrowup
asound
assumeyes
atk
authconfig
authdata
Authenticode
authprovider
auxww
Awop
backgrounding
backuptip
baiducloudcontainerengine
bannrbmp
banzaicloud
basedisk
bassano
batslib
bci
bellingham
binfmt
blahblah
blockmap
Blt
bootfs
bosco
bpf
bpffs
browserhome
brucebean
bsdtar
buildctl
buildkit
buildkitd
buildmode
buildroot
bulbasaur
bulkable
bulkaction
cacerts
camelpunch
CAPI
capslock
caroot
catalogtemplate
cbr
CCE
ceci
cecinestpasuncategory
ceph
certutil
cgroupfs
checkpath
chirico
cidata
cidfile
Cim
clientcmd
clientset
clonefile
cloudca
CNCF
cni
cnutils
commitish
composefile
confd
configjson
configmap
conflist
constrainttemplate
containerapi
containerd
CONTAINERENGINE
containernetworking
cooldown
copypac
coredns
cpanm
cpanminus
crds
credfwd
CREDHELPER
cri
crond
cshrc
ctrctl
ctxs
daemonset
dapp
datadog
dcmonitor
dcnone
dcrd
debbuild
Debugw
decapsulates
dedot
deepmap
defattr
deislabs
destinationrule
DETECTEXCEPTIONS
developercertificate
DEVMODE
dfile
didinit
diffdisk
digitalocean
dirents
distatus
distros
Dlg
dlgbmp
dlicense
DNAT
dnsmasq
doclink
donotuse
dport
dri
Duex
dustin
Dwm
dwmapi
DWMWA
EACCESS
eagerzeroedthick
eastus
ebegin
ecm
edmonton
einfo
electronjs
elko
endgroup
engineimage
epinio
EPONY
errdefs
ERRFILE
errgroup
Errorw
errwrap
escapehtml
estargz
ESXi
etcdbackup
ETest
euid
eula
excludepkgs
excludesection
Executability
EXITDIALOGOPTIONALCHECKBOX
EXITDIALOGOPTIONALCHECKBOXTEXT
exoscale
externalname
externalservice
extglob
factoryreset
fakercfile
fanotify
fav
fdx
featurename
FEEEFEEE
femto
ffi
Fflags
ficlone
filekey
filestat
fineprint
fleetworkspace
FOLDERID
fontstack
fqname
freeipa
frontends
fscache
gabcdef
gazornaanplatt
gcs
GENERALIZEDTIME
getwindowid
gha
gitmodules
gitrepo
gke
globalrole
globalrolebinding
Gluster
gname
goland
gomod
googlegke
googleoauth
gopacket
GOTOOLCHAIN
GOWORK
govet
gpu
gtk
guestagent
Gutterless
gvisor
hardlinks
hashicorp
HDD
healthz
Hec
heketi
helmcharts
hfs
hkcu
hklm
HMR
hocs
horizontalpodautoscaler
HOSTPORT
hoverable
howett
hpa
HRESULT
htpasswd
httpconfig
Huawei
huaweicce
hvsock
hwnd
hyperv
icns
Idempotently
identitytoken
iex
ifaces
ifname
ifnotstart
ifstarted
iidfile
imageinfo
IMAGENAME
IMAGEPATH
indentless
installable
INSTALLMESSAGE
INSTALLPROPERTY
IPlugin
iptable
Isf
islabel
isthebestmeshuggahalbum
istio
istiod
isv
itp
iwr
jetstack
JOBOBJECT
joycelin
jsmith
JSONOr
jsontable
JSONTo
julianb
karl
Kaspersky
kde
KDM
keycloak
keycloakoidc
keyform
keygrip
kiali
kib
Kinfo
kiwano
KNOWNFOLDERID
kontainer
kubeconfig
Kubectx
kubepods
kuberlr
Kubewarden
kurrent
kwctl
ldconfig
LGHT
limactl
limaiptables
limaloc
linds
linenum
linkname
linode
linuxkit
Linuxy
loadbalancer
loblaw
localnet
logdna
loglines
logz
lte
mabels
macarm
machinedeployment
machineset
macx
magog
mcapps
mediaselect
messageformat
metainfo
metricsection
mikey
milli
Minidriver
minimizable
missmatched
mitm
moar
moby
mockhelper
moproxy
mountinfo
MRM
msiexec
MSIHANDLE
MSIINSTALLPERUSER
MSIX
msixbundle
msize
msvs
multierror
multiport
mungers
myport
namearray
napanee
navlink
neq
nerdctl
netlink
netns
netsh
networkpolicy
neu
newauth
newfs
newpid
nginx
ngx
ninep
noarch
nocopy
nologin
nologo
nomount
NOPASSWD
noprofile
noproxy
norc
norestart
normaliser
NOSETENV
nothrow
notifempty
notset
npipe
nsenter
nsis
NSISUNINSTALLCOMMAND
nullglob
nuxt
nxt
oapi
objectset
octicons
openapitools
openldapconfig
openrc
openresty
openssh
openstack
opensuse
opentelekomcloudcontainerengine
operstate
opsgenie
oracleoke
orsection
osacompile
osascript
osc
osxkeychain
otccce
overlayfs
pagedown
pageload
pagerduty
pageup
parsesection
pascalize
pathspec
pcs
pdp
persistentvolume
persistentvolumeclaim
PFlags
pgid
pidfd
PII
pikachu
Pinganyun
pinganyunecs
plists
plutil
podmetrics
podmonitor
podsecuritypolicytemplate
POLLIN
POptions
portbinding
portforward
portmap
portmapping
portproxy
portstorage
postgres
POSTROUTING
prakhar
prebuilds
preflights
Privs
PROCARGS
procnet
procnettcp
progresskey
projectroletemplatebinding
Prometheis
prometheusrule
PROMPTROLLBACKCOST
protip
PROXYLIST
PSelected
PSHOME
psps
ptn
publicdomain
pushable
pvc
PWSTR
qcow
rackspace
ramdisks
rancherdesktop
rancherkubernetesengine
rawdata
rcedit
rcfiles
rcompare
rdctl
rddepman
rdinstall
RDRUNAFTERINSTALL
rdshell
rdsudo
rdtest
rdvsock
rdx
readyz
regexpsection
regfiles
registrationtoken
registrytoken
regtest
remotedns
replicaset
replicationcontroller
repofile
requried
resourcequota
resourceset
restclient
restoretip
reusecab
rioinfo
rke
RLENGTH
rmi
rockylinux
Roffline
rolebinding
roletemplate
roletemplatebinding
rootfs
rosetta
RSTART
rtm
Runas
runbook
runc
rundir
runlevel
runtimeclass
runtimeclasses
rvf
scaleio
scanbenchmark
scanprofile
scanreport
scinfo
screencapture
scriptdir
scriptname
scriptpath
scrollback
scrolllock
sdl
secretservice
serveraddress
servernum
serviceaccount
serviceapi
servicemonitor
servicewatcher
setproxy
sfc
sharedscripts
sharkanodo
shasta
shazbat
shortkey
shortlived
showduplicates
showmuted
shuf
sigch
signtool
singleparsesection
sio
skopeo
sku
SLAs
SLIRP
slo
SLSA
smanager
smokris
snakize
softmmu
someothername
somepaththatshouldnevereverexist
songgao
spinkube
splatform
splunk
ssd
sshfs
sslip
Ssr
STARTUPINFO
statefulset
stoinks
storageclass
storybookjs
stringifying
subkey
subshells
subvar
sumologic
SVCNAME
svm
syscalls
sysfs
tarballs
TARGETDIR
tcpip
tcshrc
TEAMID
teamocil
Telekom
templ
Tencent
tencenttke
termch
testbuild
testfilethatdoesntexist
testid
testreleasedate
testurl
thanosruler
timekey
timespan
tini
TKE
tmpconfig
tmpfiles
tmutil
toggleable
togglefullscreen
tonistiigi
toolsets
topmenu
TQF
traefik
trivy
TStr
TVar
tvf
ucmonitor
udhcpc
UEFI
unexpose
unexposing
unparsable
upcloud
Upgradable
useb
userdb
userpreference
UTCTIME
vcenter
vcpus
vde
VDropdown
VERSIONSTRING
veth
Vhd
vhdx
vinzenz
virtio
virtiofs
virtsock
virtualnetwork
virtualservice
vishvananda
VMGUID
VMID
vmnet
vmwarevsphere
vmx
vnc
vnode
vpnkit
vsock
vtunnel
vul
vznat
whatsnew
wincred
winio
winthrop
wix
wixobj
WIXUI
wontfix
wordpress
wslconfig
wslenv
WSLg
wslify
wslinfo
WSLINSTALLED
WSLIs
WSLKERNELOUTDATED
wslproxy
wslutils
WWID
wwn
wws
xauth
XAUTHORITY
xdev
xec
xfs
xmlout
xorg
XVar
xwininfo
xyzzy
xzf
yamlfmt
yarker
youmightnotneedjquery
Yubi
zeroedthick
zerowidthspace
zipperhead
ZSelected
zst
zstack
zxf
zypak
zypp
zypper
================================================
FILE: .github/actions/spelling/line_forbidden.patterns
================================================
# reject `m_data` as VxWorks defined it and that breaks things if it's used elsewhere
# see [fprime](https://github.com/nasa/fprime/commit/d589f0a25c59ea9a800d851ea84c2f5df02fb529)
# and [Qt](https://github.com/qtproject/qt-solutions/blame/fb7bc42bfcc578ff3fa3b9ca21a41e96eb37c1c7/qtscriptclassic/src/qscriptbuffer_p.h#L46)
#\bm_data\b
# Were you debugging using a framework with `fit()`?
# If you have a framework that uses `it()` for testing and `fit()` for debugging a specific test,
# you might not want to check in code where you skip all the other tests.
#\bfit\(
# English does not use a hyphen between adverbs and nouns
# https://twitter.com/nyttypos/status/1894815686192685239
(?:^|\s)[A-Z]?[a-z]+ly-(?=[a-z]{3,})(?:[.,?!]?\s|$)
# Smart quotes should match
\s’[^.?!‘’]+’[^.?!‘’]+‘[^.?!‘’]+’|\s‘[^.?!‘’]+’[^.?!‘’]+’[^.?!‘’]+’|\s”[^.?!“”]+”[^.?!“”]+“[^.?!“”]+”|\s“[^.?!“”]+”[^.?!“”]+”[^.?!“”]+”
# Don't write double negatives
\w+n't not(?=\s)
# Generally spaces follow instead of preceding `,`s
# It's possible this is some strange CSV dialect, but, even so, you could probably move the space.
\s[a-z]{3,} ,[a-z]{3,}\s
# Generally words are written with `'s`, not `"s`
[^=|+']\s\w+"s\s
# Don't miswrite **irreversible binomials**
# https://en.wikipedia.org/wiki/Irreversible_binomial
(?i)\b(?:cheese and macroni|honey and milk|sweet and short|die or do|roll and rock|the bees and the birds|match and mix|tear and wear|clear and loud|death and life|span and spick|vigor and vim|abet and aid|says and deposes|means and ways|dryer and washer|relaxation and rest|famous and rich|loan and savings|come high\s?water or hell|tuck and nip|turf and surf|between a hard place and a rock|dime and five|mouse and cat|tired and sick|pregnant and barefoot|feathered and tarred|feathers and tar|subtraction and addition|liabilities and assets|forth and back|strikes and balls|end to beginning|white and black|small and big|bust or boom|groom and bride|sister and brother|pass and butt|sell and buy|release and catch|effect and cause|state and church|robbers and cops|go and come|going and coming|Indians and cowboys|nights and days|wide and deep|flow and ebb|ice and fire|last and first|ceiling to floor|drink and food|aft and fore|domestic and foreign|backward and forward|foe or friend|back to front|vegetables and fruits|take and give|evil and good|foot and hand|heels over head|Hell and Heaven|there and here|seek and hide|dale and hill|her and him|low and high|valleys and hills|hers and his|thither and hither|yon and hither|cold and hot|wife and husband|out and in|gentlemen and ladies|sea and land|death or life|short and long|found and lost|hate and love|war and love|wife and man|matter over mind|pop and mom|nice or naughty|far and near|tuck and nip|south to north|then and now|later and now|shut and open|under and over|ride and park|starboard and port|cons and pros|pull and push|file and rank|fall and rise|loan and savings|water and soap|finish to start|go and stop|dip and strike|sour and sweet|thin and thick|ring and tip|fro and to|bottom to top|country and town|down and up|downs and ups|downtown and uptown|peace and war|dryer and washer|wane and wax|no and yes|yang and yin|a curse and a blessing|don'ts and dos |farewell and hail|wait and hurry up|difference\s(?:\w+\s+)+day and night|in health and in sickness|from stern to stem|the dead and the quick|a place and a time|generations and ages|comfort and aid|alack and alas|pieces and bits|soul and body|early and bright|mortar and brick|jowl by cheek|tidy and clean|verse and chapter|saucer and cup|cents and dollars|loathing and fear|chips and fish|foremost and first|farewell and hail|fist over hand|shoulders and head|soul and heart|spices and herbs|home and house|thirst and hunger|fork and knife|bounds and leaps|behold and lo|tidy and neat|dime and nickel|cranny and nook|void and null|bolts and nuts|suffering and pain|quiet and peace|ink and pen|choose and pick|simple and plain|proper and prim|rave and rant|shoals and rocks|awe and shock|wonders and signs|bones and skull|crossbones and skull|narrow and strait|narrow and straight|strain and stress|roundabouts and swings|chiggers and ticks|complain and whine|rain and wind|amen and yea|(?:raised|bred) and born|by crook or by hook|(?<=it was a )stormy and dark(?= night)|(?<=this ) age and day|cross the t's and dot the i's|high minded and haughty|best and highest(?= use)|like daughter, like mother|done and over with|(?<=on ) needles and pins|half a dozen of the other, six of one|(?<=up ) personal and close|baggage and bag|beads and baubles|balance and beams|breakfast and bed|braces and belt|bar and bench|bad and big|bosh bash bish|blue and black|beautiful and bold|Baptists and bootleggers|briefs or boxers|butter and bread|boar and bull|carry and cash|cheese and chalk|clans and cliques|control and command|cream and cookies|dumb and deaf|dash and dine|dirty and down|drabs and dribs|drive and drink|disorderly and drunk|furious and fast|famine or feast|forget and fire|fury and fire|fauna and flora|forget and forgive|function and form|foe or friend|frolics and fun|feathers and fur|goblins and ghosts|giggles and grins|home and hearth|haw and hem|holler and hoot|handgrenades and horseshoes|Gentile and Jew|jiving and juking|country and king|caboodle and kit|kin and kith|longitude and latitude|limb and life|learn and live|load and lock|match and mix|mild and meek|number and name|parcel and part|pencil and pen|post to pillar|pans and pots|perish or publish|riches to rags|raving and ranting|write and read|rumble to ready|wrong and right|roll and rock|ready and rough|regulations and rules|secure and safe|sound and safe|shell and shot|shave and shower|symptoms and signs|slide and slip|span and spick|shine and spit|Stripes and Stars|stones and sticks|spice and sugar|that or this|tat for tit|tail and top|turn and toss|treat or trick|tribulations and trials|tested and tried|true and tried|trailer and truck|wear and wash|waiting and watching|wail and weep|wild and wet|hollering and whooping|woolly and wild|wonderful and wise|warlocks and witches|ruin and wrack|the bees and the birds|(?<=between the) deep blue sea and the devil|Dragons & Dungeons|fuck off or fit in|flop-flip|fancy-free and footloose|to hold and to have|least but not last|Lease-Lend|leave ['‘]em and love ['‘]em|leave it or love it|paper and pen(?:cil|)|patter-pitter|relaxation and rest|(?<=without )reason or rhyme|tacky-ticky|take and break|zoom and boom|cox and box|talk and chalk|darts and charts|dip and chips|drive and dive|square and fair|dime and five|jetsam and flotsam|dry and high|fire and hire|split and hit|thither and hither|trot to hot|puff and huff|bustle and hustle|gap and lap|greatest and latest|proud and loud|greet and meet|right makes might|shame and name|dear and near|sods and odds|upwards and onwards|about and out|proud and out|dump and pump|tough and rough|gun and run|clout and shout|bake and shake|surely but slowly|joke and smoke|dash and stash|bitch and stitch|drop and stop|turf and surf|tide and time|gown and town|bake and wake|tear and wear|feed and weed|dealing and wheeling|dine and wine|nay or yea|trouble double|bender fender|dandy-handy|panky-hanky|scarum-harum|skelter helter|piggledy higgledy|quit it and hit|pocus hocus|toity[- ]hoity|potch-hotch|burly-hurly|bitty-itty|bitsy-itsy|votor moter|the highway or my way|pamby-namby|claim it and name it|ever, never|gritty nitty|porgy orgy|mell-pell|baggy saggy|so good, so far|weeny-teeny|blue true|lose it or use it|nilly willy|(?<=the )nays and (?:the |)yeas|beyond and above|graces and airs|muster and alarm|kicking and alive|well and alive|dangerous and armed|oranges and apples|fill and back|forth and back|eggs and bacon|mash and bangers|switch and bait|tackle and bait|pregnant and barefoot|sale and bargain|breakfast and bed|call and beck|whistles and bells|suspenders and belt|bold and big|tall and big|better and bigger|purge and binge|bridle and bit|bobs and bits|pieces and bits|blue and black|tackle and block|guts and blood|gore and blood|weave and bob|arrow and bow|determined and bound|gagged and bound|scrape and bow|bit and brace|water and bread|circuses and bread|roses and bread|serve and brown|spade and bucket|grind and bump|run and bump|large and by|gown and cap|driver and car|mouse and cat|balances and checks|dumplings and chicken|change and chop|sober and clean|dagger and cloak|tie and coat|doughnuts and coffee|go and come|burn and crash|sugar and cream|punishment and crime|saucer and cup|paste and cut|run and cut|burdock and dandelion|night and day|buried and dead|gone and dead|taxes and death|dash and dine|conquer and divide|out and down|cover and duck|dive and duck|every and each|ears and eyes|figures and facts|wide and far|furious and fast|loose and fast|dandy and fine|thumbs and fingers|brimstone and fire|foremost and first|chips and fish|blood and flesh|bone and flesh|ever and forever|center and front|games and fun|bother and fuss|take and give|aspirations and goals|plenty and good|light and goodness|pound and ground|slash and hack|hearty and hale|fast and hard|eggs and ham|nail and hammer|sickle and hammer|tongs and hammer|minds and hearts|now and here|seek and hide|watch and hide|mighty and high|dry and high|tight and high|miss and hit|run and hit|yon and hither|thither and hither|hosed and home|dry and home|eye and hook|loop and hook|buggy and horse|carriage and horse|heavy and hot|high and hot|bothered and hot|puff and huff|when and if|custard and kippers|tell and kiss|kin and kith|fork and knife|screaming and kicking|streams and lakes|order and law|behold and lo|dam and lock|key and lock|feel and look|clear and loud|boy and man|potatoes and meat|women and men|cookies and milk|honey and milk|tenon and mortise|shakers and movers|address and name|faces and names|easy and nice|cranny and nook|crosses and noughts|bolts and nuts|ends and odds|away and off|done and one|about and out|out and over|terminer and oyer|cream and peaches|Qs and Ps|carrots and peas|axe and pick|moan and piss|vinegar and piss|whine and piss|proper and prim|booty and prize|cons and pros|beans and pork|simple and pure|dirty and quick|pinion and rack|ruin and rack|pillage and rape|famous and rich|fall and rise|shine and rise|board and room|tumble and rough|jump and run|pepper and salt|vinegar and salt|sniff and scratch|rescue and search|destroy and seek|tie and shirt|fat and short|sweet and short|stout and short|tell and show|jive and shuck|tired and sick|burn and slash|arrows and slings|fall and slip|steady and slow|grab and smash|mirrors and smoke|ladders and snakes|dance and song|fury and sound|polish and spit|deliver and stand|strain and stress|Drang und Sturm|debonair and suave|tie and suit|rainbows and sunshine|demand and supply|light and sweetness|sandal and sword|chairs and tables|thin and tall|feathers and tar|crumpets and tea|lightning and thunder|ass and tits|fro and to|nail and tooth|go and touch|field and track|error and trial|tribulations and trials|roll and tuck|turn and twist|about and up|coming and up|vigor and vim|see and wait|fuzzy and warm|weft and warp|ward and watch|wane and wax|means and ways|good and well|whine and whinge|roses and wine|phrases and words|no and yes|a leg and an arm|(?<=old )chain and ball|by golly and by guess|bull-and-cock|dried (dry) and cut|(?<=in this )age and day|pony and dog show|(?<=by )starts and fits|grin and bear it|(?<=move ) earth and heaven|quit it and hit it|kisses and hugs|(?<=for all )purposes and intents|make up and kiss|last testament and will|make do and mend|(?<=every ) then and now|for all and once(?=[,.;!?])|jelly and peanut butter|ice cream and pickles|raining dogs and cats|development and research|blues and rhythm|(?<=between a )hard place and a rock|(?<=all's )done and said|(?<=different )sizes and shapes|bones? and skin|(?<=in )spirit and (?:in |)truth|a miss and a swing|(?<=through )thin and thick|O's and X's|a day and a year|nothing or all|worse or better|small or big|white or black|pleasure or business|night or day|alive or dead|die or do|flight or fight|take or give|bad or good|simple or gentle|she or he|tails or heads|her or his|miss or hit|cure or kill|break or make|less or more|never or now|shine or rain|reason or rhyme|wrong or right|swim or sink|later or sooner|more or two|down or up|death or victory|lose or win|no or yes|the egg or (?:the |)chicken|(?<=neither )fowl nor fish|(?<=come )high water or hell|(?<=neither )there nor here|(?<=neither )hair nor hide|(?<=not one )tittle or jot|(?<=neither )money nor love|shut up or put up|leave it or take it|(?<=neither )ornament nor use|gatherer-hunter|cheese corn|Costello and Abbott|Isaac and Abraham|Patroclus and Achilles|Eve and Adam|Anicetus and Alexiares|Cleopatra and Antony|Ant & Dec|Robin and Batman|Clyde and Bonnie|Abel and Cain|Ball and Cannon|Pollux and Castor|Psyche and Cupid|Clack and Click|Pythias and Damon|Goliath and David|Guattari and Deleuze|Jane and Dick|Marguerite and Faust|Swann and Flanders|Saunders and French|Frack and Frick|Laurie and Fry|Sullivan and Gilbert|Aga and Gilgamesh|Gretel and Hansel|Hellman & Friedman|Esau and Jacob|Jill and Jack|Victor and Jack|Vijaya and Jaya|Jekyll & Hyde|Hardy and Laurel|McCartney and Lennon|Loewe and Lerner|Clark and Lewis|Lilo & Stitch|Large and Little|Meslamta-ea and Lugal-irra|Luigi and Mario|Lewis and Martin|Ashley and Mary-Kate Olsen|Sue and Mel|Wise and Morecambe|Mindy and Mork|Eurydice and Orpheus|Horse-Face and Ox-Head|Penn & Teller|Aristotle and Phyllis|Ferb and Phineas|Pinky & The Brain|Galatea and Pygmalion|Ren & Stimpy|Rhett & Link|Morty and Rick|Hart and Rodgers|Hammerstein and Rodgers|Juliet and Romeo|Remus and Romulus|Guildenstern and Rosencrantz|Max and Sam|Delilah and Samson|Simon & Garfunkel|Sonny & Cher|Thelma & Louise|Thompson and Thomson|Tom & Jerry|Isolde and Tristan|Tim & Eric|Adonis and Venus|Vic & Bob|Crick and Watson|Eve and Adam|pears and apples|glass and bottle|Liszt and Brahms|bone and dog|toad and frog|blister and hand|south and north|pork and rabbit|strife and trouble|eight and two|flute and whistle)\b
# Don't use `requires that` + `to be`
# https://twitter.com/nyttypos/status/1894816551435641027
\brequires that \w+\b[^.]+to be\b
# A fully parenthetical sentence’s period goes inside the parentheses, not outside.
# https://twitter.com/nyttypos/status/1898844061873639490
\([A-Z][a-z]{2,}(?: [a-z]+){3,}\)\.\s
# Complete sentences shouldn't be in the middle of another sentence as a parenthetical.
(?<!\.)(?<!\betc)\.\),
# Complete sentences in parentheticals should not have a space before the period.
\s\.\)(?!.*\}\})
# Write out small numbers (unless they are code)
# See https://www.scribendi.com/academy/articles/when_to_spell_out_numbers_in_writing.en.html#:~:text=Writing%20Small%20and%20Large%20Numbers,ten%29%20are%20written%20as%20numerals%2e
#(?<![=>]|depth|frame|page|project|select)\s[1-9] (?!byte|day|hour|meaning|minute|month|(?:new |)page|people|(?:more |)space|year)[a-z]+ [a-z]+\s
# Write out numbers at the start of a sentence
# https://www.scribendi.com/academy/articles/when_to_spell_out_numbers_in_writing.en.html#:~:text=Beginning%20a%20Sentence%20with%20a%20Number,may%20be%2e
(?:\b[a-z]{4,}|\s(?:[a-eg-z][a-z]{2}|f[a-hj-z][a-z]|fi[a-fh][a-z]))[:.?!] [1-9] [a-z]{3,} [a-z]+\s\w+
# Don't write two numbers in a row
# https://www.scribendi.com/academy/articles/when_to_spell_out_numbers_in_writing.en.html#:~:text=Paired%20Numbers%20%28Two%20Numbers%20in,librarian%20to%20begin%20story%20time%2e
(?:[a-z]{4,}|\s(?!apr|aug|dec|feb|fri|jan|mar|mon|nov|oct|sat|sep|sun|thu|tue|wed)[a-z]{3})\s\d+\s\d+(?!--)[-\s](?:(?!--)[-A-Za-z]){2,}\s
# This probably indicates Mojibake https://en.wikipedia.org/wiki/Mojibake
# You probably should try to unbake this content
Ã(?:Â[¤¶¥]|[£¢])|Ã
# Should be `HH:MM:SS`
\bHH:SS:MM\b
# Should be `86400` (seconds in a standard day)
\b84600\b(?:.*\bday\b)
# Should probably be `2006-01-02` (yyyy-mm-dd)
# Assuming that the time is being passed to https://go.dev/src/time/format.go
\b2006-02-01\b
# Should probably have a trailing `.`
\s([a-z]\.){2,}[a-z]\s
# Should probably end with `”`
# Likely bad OCR
“.+[^'‘\\\[]+’'(?!['"])
# Should probably end with `”` or with only one of `’`/`'`
\s\w+[^'‘\\\[]+’'(?!['"])
# Should probably be matching (smart)quotes or backticks (if Markdown)
# Unless the file format is Tex
(?<!`)``(?!`).*?''
# Should probably be `YYYYMMDD`
\b[Yy]{4}[Dd]{2}[Mm]{2}(?!.*[Yy]{4}[Dd]{2}[Mm]{2}).*$
# Should be `a bit of`
(<=\bquite )some(?= hands-on)
# Should be `a few`
(<=\bquite )some(?= hands\s)
# Should be `a priori` or `and prior`
(?i)(?<!posteriori)\sand priori\s
# Should be `a`
\san (?=(?:[b-df-gjklpqtvwz]|h(?!our|s[lv]|tml|ttp|ref)|n(?!ginx|grok|pm)|r(?!c)|s(?!s[ho]|vg))[a-z]|x(?!\d|ml))
# Articles generally shouldn't be used without a noun and a verb
# - Perhaps you're missing a verb between the noun and the second article.
# - Or, perhaps you should remove the first verb and treat the intervening word as a verb?
# - In some cases you should add a `,` between the noun and the second article.
\s(?:an?|the)\s(?!wh|how\b)[A-Za-z][a-z]+[a-qs-z]\s(?:an?|the(?! same))\s
# Should only be one of `a`, `an`, or `the`
\b(?:(?:an?|the)\s+){2,}\b
# Should be `a large amount` or `large amounts`
(?<=\bof )large amount(?= of data\b)
# Should be a list `something, a second thing, or a third thing` or `something, a thing to do a thing`
# -- This rule is experimental, if you find it has a high false-positive rate, please let the maintainer know
(?:^|[?!.] )(?:(?![Ff]or example|Currently|In \w)[^()?!;,.])+, a(?:\s+(?!and|to\b)\w+)+?\s+an?\b
# Should only be `are` or `can`, not both
\b(?:(?:are|can)\s+){2,}\b
# Should be `at` or possibly `in`
\bon(?= the (?:top|bottom) (?:left|right) \w+)
# Should probably be `ABCDEFGHIJKLMNOPQRSTUVWXYZ`
(?i)(?!ABCDEFGHIJKLMNOPQRSTUVWXYZ)ABC[A-Z]{21}YZ
# Should be `please` or `also, please`
# https://english.stackexchange.com/questions/106165/please-do-also-or-please-also
\b[Pp]lease(?:, do|) also\b
# Should be `an`
#(?<!\b[Ii] )(?<![-.])(?<!\d\s?)\bam\b(?!/pm|[:")])
# Should be `an`
\sa(?= (?:a(?!nd\s|s\s)|e(?!u)|i(?![ns]\s)|o(?!nc?e)|u(?!biquitous|int|kr|n[ai]|r[ael]|s[aeiu]|tf\d*|til|topia|uid|vula|v\b)|y(?!arn|ear|oga|y)))
# Should be `anymore`
\bany more[,.]
# Should be `Ask`
(?:^|[.?]\s+)As\s+[A-Z][a-z]{2,}\s[^.?]*?(?:how|if|wh\w+)\b
# Should be `at one fell swoop`
# and only when talking about killing, not some other completion
# Act 4 Scene 3, Macbeth
# https://www.opensourceshakespeare.org/views/plays/play_view.php?WorkID=macbeth&Act=4&Scene=3&Scope=scene
\bin one fell s[lw]?oop\b
# Should be `'`
(?i)\b(?:(?:i|s?he|they|what|who|you)[`"]ll|(?:are|ca|did|do|does|ha[ds]|have|is|should|were|wo|would)n[`"]t|(?:s?he|let|that|there|what|where|who)[`"]s|(?:i|they|we|what|who|you)[`"]ve)\b
# Should be `background` / `intro text` / `introduction` / `prologue` unless it's a brand or relates to _subterfuge_
(?i)\bpretext\b
# Should be `Bitbucket`
\bBitBucket\b
# Should be `bearer`
\b(?<=the )burden(?= of bad news\b)
# Should be `beginning`
\b(?<=from )begin(?= to end\b)
# Should be `bona`
# unless talking about bones
\bbone(?= fide\b)
# Should be `branches`
# ... unless it's really about the meal that replaces breakfast and lunch.
\b[Bb]runches\b
# Should be `briefcase`
\bbrief-case\b
# Should be `by`
(?<=caused )from(?= an?\b)
# Should be `by far` or `far and away`
\bby far and away\b
# Should be `by and large`
\bby in large\b
# Should be `bytes`
# unless talking about sports where a team gets to skip a game, or
# saying `goodbyes` (even this is questionable)
(?<!\\)\bbyes\b
# Should be `can, not only ..., ... also...`
\bcan not only.*can also\b
# Should be `cannot` (or `can't`)
# See https://www.grammarly.com/blog/cannot-or-can-not/
# > Don't use `can not` when you mean `cannot`. The only time you're likely to see `can not` written as separate words is when the word `can` happens to precede some other phrase that happens to start with `not`.
# > `Can't` is a contraction of `cannot`, and it's best suited for informal writing.
# > In formal writing and where contractions are frowned upon, use `cannot`.
# > It is possible to write `can not`, but you generally find it only as part of some other construction, such as `not only . . . but also.`
# - if you encounter such a case, add a pattern for that case to patterns.txt.
\b[Cc]an not\b(?! only\b)
# Should be `chart`
(?i)\bhelm\b.*\bchard\b
# Should be `code`
(?<=\bof )a code(?= that\b)
# Should be `counter-intuitive`
\bcounter intuitive\b
# Do not use `(click) here` links
# For more information, see:
# * https://www.w3.org/QA/Tips/noClickHere
# * https://webaim.org/techniques/hypertext/link_text
# * https://granicus.com/blog/why-click-here-links-are-bad/
# * https://heyoka.medium.com/dont-use-click-here-f32f445d1021
(?i)(?:>|\[)(?:(?:click |)here|link|(?:read |)more)(?:</|\]\()
# Including "image of" or "picture of" in alt text is unnecessary.
\balt=['"](?:an? |)(?:image|picture) of
# Alt text should be short
\balt=(?:'[^']{126,}'|"[^"]{126,}")
# Should be either of `default` or `fallback`, but not both
# Unless you have a non-default fallback, but that's just weird.
\bdefault fallback\b
# Should be `dress code`
\bdressing code\b
# Should be `effect`
(?<=\btake )affect\b
# Should be `end`
(?<=\b[Ww]e )ends\b
# Should be `ends`
\bend's(?= up\b)
# Should be `-endian`
\b(?i)(?<=big|little) endian\b
# Should be `equals` to `is equal to`
\bequals to\b
# Should be `equal to`, `equal width`, or reworded
\bequal with\b(?! (?:no|respect))
# Should be `eta` or `calculate eta`
(?i)\bestimated? eta\b
# Should be `ECMA` 262 (JavaScript)
(?i)\bTS\/EMCA\b|\bEMCA(?: \d|\s*Script)|\bEMCA\b(?=.*\bTS\b)
# Should be `ECMA` 340 (Near Field Communications)
(?i)EMCA[- ]340
# Should be `exceed`
\bare higher than\b
# Should be `exceeds`
\bis higher than\b
# Should be `fall back`
(?<!\ba )\bfallback(?= to)\b
# Should be `for`, `for, to` or `to`
\b(?:for to|(?<!\bup )to for)\b
# Should be `ghcr.io`
# https://bmitch.net/blog/2025-08-22-ghrc-appears-malicious/
\bghrc\.io\b
# Should be `GitHub`
(?<![&*.]|// |\b(?:from|import|type) )\bGithub\b(?![{()])
# Should be `GitLab`
(?<![&*.]|// |\b(?:from|import|type) )\bGitlab\b(?![{()])
# Should be `GmbH`
\bGmbh\b
# Should be `heartrending` unless talking about drawing hearts
\b(?i)heart[- ]rendering\b(?![^.?!]*(?:hearts|quirk))
# Should probably be `https://`...
# Markdown generally doesn't assume that links are to urls
\]\(www\.\w
# Should be `https://www.chiark.greenend.org.uk/~sgtatham/putty/`
# See https://hachyderm.io/@simontatham/114846017785770922
\bputty\.org\b
# Often should be `if`/`when` (or reworded)
# unless describing exceptional cases (i.e. emergencies)
#(?<!just )\bin case\b(?! (?:I|s?he|they|of|we|you))
# Should be `in`
#(?<=\b(?:go|reach) back )into(?= time\b)
# Should be `in` or `out`
(?<=\bfill )up(?= the forms?\b)
# Should be `intents and purposes`
(?<=[Ff]or all )intensive purposes\b
# Should be `JavaScript`
\bJavascript\b
# Should be `Jira`
\bJIRA\b(?!-\d+)
# Should be `macOS` or `Mac OS X` or ...
\bMacOS\b
# Should be `Microsoft`
\bMicroSoft\b
# Should be `OAuth`
(?:^|[^-/*$])[ '"]oAuth(?: [a-z]|\d+ |[^ a-zA-Z0-9:;_.()])
# Should be `pytest`
# see https://docs.pytest.org/en/stable/
\bPytest\b
# Should be `RabbitMQ`
\bRabbitmq\b
# Should be `TensorFlow`
\bTensorflow\b
# Should be `TypeScript`
\bTypescript\b
# Should be `also need to`
\bneed to also\b
# Should be `another`
\ban[- ]other(?!-)\b
# Should be `case-(in)sensitive`
\bcase (?:in|)sensitive\b
# Should be `Cloud`
CLoud
# Should be `coinciding`
\bco-inciding\b
# Should be `convert`
# Unless talking about a thing named `Covert`
\b[Cc]overt(?= (?!channel)\w+ to\b)
# Should be `deprecation warning(s)`
\b[Dd]epreciation [Ww]arnings?\b
# Should be `disk space.`
(?<=to save )disk\.(?![a-zA-Z])
# Should be `gets`
\scommand get the\s
# Should be `greater than`
\bgreater then\b
# Should be `has`
\b[Ii]t only have\b
# Should be `here-in`, `the`, `them`, `this`, `these` or reworded in some other way
\bthe here(?:\.|,| (?!and|defined))
# Should be `going to bed` or `going to a bad`
\bgoing to bad(?!-)\b
# Should be `greater than`
\bhigher than\b
# Should be `Homebrew`
\bHomeBrew\b
# Should be `ID` (unless it's a flag/property/RCS variable)
(?<![-\.$])\bId\b(?![(=:'"]| )
# Should be `in front of`
\bin from of\b
# Should be `into`
# when not phrasal and when `in order to` would be wrong:
# https://thewritepractice.com/into-vs-in-to/
#(?<!opt)\sin to\s(?!if\b)
# Should be `use`
\sin used by\b
# Should be `in-depth` if used as an adjective (but `in depth` when used as an adverb)
\bin depth\s(?!before\b|rather\b)\w{6,}
# Should be `in-flight` or `on the fly` (unless actually talking about airline flights)
\bon[- ]flight\b(?!=\s+(?:(?:\w{2}|)\d+|availability|booking|computer|data|delay|departure|management|performance|radar|reservation|scheduling|software|status|ticket|time|type|.*(?:hotel|taxi)))
# Should be `in case`
\bencase(?= of)\b
# Should be `is obsolete`
\bis obsolescent\b
# Should be `it's` or `its`
(?<![.'])\bits['’]
# Should be `its`
(?<=\b(?:in|of) )it's\b
# Should be `its`
\bit's(?= (?:child|only purpose|own(?:er|)|parent|sibling)\b)
# Should be `its`
(?<!since )\bit's(?= data\b)
# Should be `... its`
\w{2}(?<!\b(?:case|fail|know|mean|perhap|purpose|sometime|think|unles|ye))s it's\b(?! (?:an?|going|not|own|the|\w+ed)\b)
# Should be `for its` (possessive) or `because it is`
\bfor it(?:'s| is)\b
# Should be `lends`
\bleads(?= credence)
# Should be `few times` or `little time`
(?<=\bvery )few time\b
# Should be `log in`
\blogin to the
# Should be `long-standing`
\blong standing\b
# Should be `lose`
(?<=\bwill )loose\b
# Should be `OAuth`
\bOauth\b
# Should be `paste`
(?<=and )past(?= it)
# `apt-key` is deprecated
# ... instead you should be writing a pair of files:
# ... * the gpg key added to a distinct key ring file based on your project/distro/key...
# ... * the sources.list in a district file -- not simply appended to `/etc/apt/sources.list` -- (there is a newer format [DEB822](https://manpages.debian.org/bookworm/dpkg-dev/deb822.5.en.html)) that references the gpg key.
# Consider:
# ````sh
# curl http://download.something.example.com/$DISTRO/Release.key | \
# gpg --dearmor --yes --output /usr/share/keyrings/something-distro.gpg
# echo "deb [signed-by=/usr/share/keyrings/something-distro.gpg] http://download.something.example.com/repositories/home:/$DISTRO ./" \
# >> /etc/apt/sources.list.d/something-distro.list
# ````
\bapt-key add\b
# Should be `nearby`
\bnear by\b
# Should be `necessary`
(?<=\blonger )needed(?= to\b)
# Should probably be a person named `Nick` or the abbreviation `NIC`
\bNic\b
# Should be `not supposed`
\bsupposed not\b
# Should be `Once this` or `On this` or even `One that`. Rarely `One, this`
[?!.] One this\b
# Should probably be `much more`
\bmore much\b
# Should be `perform its`
\bperform it's\b
# Should be `PowerPoint`
\bPowerpoint\b
# Should be `opt-in`
(?<!\scan|for)(?<!\smust)(?<!\sif)\sopt in\s
# Should be `out-of-date` if acting as an adjective before a noun
\bout of date(?= \w{3,}\b)
# Should be `less than`
\bless then\b|\blesser than\b
# Should be `load balancer`
\b[Ll]oud balancer
# Should be `I may be`, or `I, maybe`
\bI maybe\b
# Should be `moot`
\bmute point\b
# Should be `one of`
(?<!-)\bon of\b
# Should be `on the other hand`
\b(?i)on another hand\b
# Reword to `on at runtime` or `enabled at launch`
# The former if you mean it can be changed dynamically.
# The latter if you mean that it can be changed without recompiling but not after the program starts.
\bswitched on runtime\b
# Should be `Of course,`
[?.!]\s+Of course\s(?=[-\w\s]+[.?;!,])
# Most people only have two hands. Reword.
\b(?i)on the third hand\b
# Should be `Open Graph`
# unless talking about a specific Open Graph implementation:
# - Java
# - Node
# - Py
# - Ruby
\bOpenGraph\b
# Should be `OpenShift`
\bOpenshift\b
# Should be `otherwise`
\bother[- ]wise\b
# Should be `; otherwise` or `. Otherwise`
# https://study.com/learn/lesson/otherwise-in-a-sentence.html
, [Oo]therwise\b
# Should probably be `Otherwise,`
(?<=\. )Otherwise\s
# Should be `or (more|less)`
\bore (?:more|less)\b
# Should be `or`
\b(?i)true of .*false\b
# Should be `pale`
\b(?<=beyond the )pail\b
# Should be reworded.
# `passthrough` is an adjective
# `pass-through` could be a noun
# `pass through` would be a verb phrase
\b(?i)passthrough(?= an?\b)
# Should be `rather than`
\brather then\b
# Should be `Red Hat`
\bRed[Hh]at\b
# Should be `regardless, ...` or `regardless of (whether)`
\b[Rr]egardless if you\b
# Should probably be `(s)` if trying to say "word(s)"
# False positive if `/s` is used to mean `per second`
\s[a-z]{2,}[a-rt-z]/s\s(?=[a-oq-z]\w{2}|p[a-df-z]\w|pe[a-qs-z]|per[a-z])
# Should be `self-signed`
\bself signed\b
# Should be `SendGrid`
\bSendgrid\b
# Should be `set up` (`setup` is a noun / `set up` is a verb)
\b[Ss]etup(?= (?:an?|the|to)\b)
# Should be `state`
\bsate(?=\b|[A-Z])|(?<=[a-z])Sate(?=\b|[A-Z])|(?<=[A-Z]{2})Sate(?=\b|[A-Z])
# Should be `succeed` (or `successfully`)
(?i)(?<=\bshould )success\b
# Should be `times`
(?<=\ba few )time\b
# Should be `that`
\b[Tt]hat's(?= would)
# Should be `then` (or occasionally `that`)
# Original GitHub query: "/ than the \w+ must/ NOT /(er|more|less|worse|different\w*)(?: \w+|)(,[^.?!]+,|) than the/"
# RegEx engines don't tend to appreciate variable length negative bookbehind
(?<!er|ly)(?<!more|less)(?<!worse)(?<!different)\sthan(?= the \w+ must)
# Should be `this`
\b[Tt]oday(?= morning\b)
# Should be `through`
# unless the next concept is something that is being thrown
(?i)\bbl[eo]w thr[eo]w(?! (?:him|her|me|them?|us)(?! in))\b
# Should be `to use`
\bto now use\b
# Should be `let's` or `let us`
\b[Ll]ets (?=throw\.)
# Should be `no longer needed`
\bno more needed\b(?! than\b)
# Should be `<see|look> below for the`
(?i)\bfind below the\b
# Should be `then any` unless there's a comparison before the `,`
, than any\b
# Should be `did not exist`
\bwere not existent\b
# Should be `not exist` or `nonexistent`
(?<!(?i)IF|WHERE )\bnot exists\b
# Should be `nonexistent`
\bnon existing\b
# Should be `nonexistent`
\b[Nn]o[nt][- ]existent\b
# Should be `only does`
\bdoes only(?! (?:seem|match))\b
# Should be `only matches`
\bdoes only match\b
# Should be `only seems`
\bdoes only seem\b
# Should be `our`
\bspending out time\b
# Should be `@brief` / `@details` / `@param` / `@return` / `@retval`
(?:^\s*|(?:\*|//|/*)\s+`)[\\@](?:breif|(?:detail|detials)|(?:params(?!\.)|prama?)|ret(?:uns?)|retvl)\b
# Should be `more than` or `more, then`
\bmore then\b
# Should be `Pipeline`/`pipeline`
(?:(?<=\b|[A-Z])p|P)ipeLine(?:\b|(?=[A-Z]))
# Should be `please do not`/`you do not need`
[Pp]lease do not need
# Should be `preexisting`
[Pp]re[- ]existing
# Should be `preempt`
[Pp]re[- ]empt\b
# Should be `preemptively`
[Pp]re[- ]emptively
# Should be `prepopulate`
[Pp]re[- ]populate
# Should be `prerequisite`
[Pp]re[- ]requisite
# Should be `principal`
[Pp]rinciple(?= [Ee]ngineer)
# Should be `QuickTime`
\bQuicktime\b
# Should be `recently changed` or `recent changes`
[Rr]ecent changed
# Should be `reentrancy`
[Rr]e[- ]entrancy
# Should be `reentrant`
[Rr]e[- ]entrant
# Should be `room for`
\brooms for (?!lease|rent|sale)
# Reword
\b(?i)same as for\b
# Should be `socioeconomic`
# https://dictionary.cambridge.org/us/dictionary/english/socioeconomic
socio-economic
# Should be `strong suit`
\b(?:my|his|her|their) strong suite\b
# Should probably be `temperatures` unless actually talking about thermal drafts (things birds may fly on)
\bthermals\b
# Should be `there are` or `they are` (or `they're`)
(?i)\btheir are\b
# Should be `they have` or `have the` or ...
\bthe (?:have(?! nots)|has)\b
# Should be `too`
(?<=\sit's )to(?= (?:big|large|small|tiny|important))
# Should be `too`
(?<=\bway )to(?= many\s)
# Should be `true`
(?i)(?<![\[\]()])\brue(?:= or false)
# Should be `understand`
\bunder stand\b
# Should be `upside down`
\bup side down\b
# Should be `URI` or `uri` unless it refers to a person named `Uri` (or a flag)
(?<![-\.])\bUri\b(?![(])
# Should be `it uses is`
/\bis uses is\b/
# Should be `uses it as`
(?:^|\. |and )uses is as (?!an?\b|follows|livestock|[^.]+\s+as\b)
# Should be `was`
\bhas been(?= removed in v?\d)
# Should be `where`
\bwere they are\b
# Should be `whether or not ...`
\bwhether(?:\s\w+)+ or not\.
# Should be `why`
, way(?= is [^.]*\?)
# Should be `wouldn't`
would'nt
# should be `vCenter`
\bV[Cc]enter\b
# Should be `VM`
\bVm\b
# Should be `void`
(?<=\bnull and)avoid\b
# Should be `way too`, `ways to`, or have some extra punctuation
\sways too\s(?=\w)
# Should be `walkthrough(s)`
\bwalk-throughs?\b
# Should be `want`
(?<=\bdon't )ant\b
# Should be `we'll`
\bwe 'll\b
# Should be `Webex`
\bWebEx\b
# Should be `week`
# unless you're really talking about people or pointers
\bevery weak[.,?!]
# Should be `well`
\b[Yy]ou(?:'re| are) doing good\b
# Should be `well`
# unless there is a word after good and good is modifying it...
\b(?<=[Dd]oing pretty )good(?! stuff\b)
# Should be `WhatsApp`
Whatsapp
# Should probably be `when`/`where` or reworded
\bat the point\b
# Should be `whereas`
\bwhere as\b
# Should be `which`
# unless you're talking about Halloween/D&D/wizards/broomsticks
\bwitch\b
# Should be _verb in infinitive form_
(?<=\bwill )(?!(?:(?:b|sp|\b)ring|cities|focus|its|shed|sometimes|th[iu]s|[a-z]+s (?:be|of))\b)[a-z]+(?:[a-df-z]ed|ing|[a-rt-xz]s)\b
# Should be `WinGet`
\bWinget\b
# Should be `without` (unless `out` is a modifier of the next word)
\bwith out\b(?!-)
# Should be `wondering`
\bwandering(?= why)
# Should be `work around`
\b[Ww]orkaround(?= an?\b)
# Should be `workarounds`
\bwork[- ]arounds\b
# Should be `workaround`
(?:(?:[Aa]|[Tt]he|ugly)\swork[- ]around\b|\swork[- ]around\s+for)
# Should be `worst`
(?i)worse-case
# Should be `you are not` or reworded
\byour not\b
# Should be `your`
(?i)\byou're(?= time\b(?! traveling))
# Should be `(coarse|fine)-grained`
\b(?:coarse|fine) grained\b
# Homoglyph (Cyrillic) should be `A`/`B`/`C`/`E`/`H`/`I`/`I`/`J`/`K`/`M`/`O`/`P`/`S`/`T`/`Y`
# It's possible that your content is intentionally mixing Cyrillic and Latin scripts, but if it isn't, you definitely want to correct this.
(?<=[A-Z]{2})[АВСЕНІӀЈКМОРЅТУ]|[АВСЕНІӀЈКМОРЅТУ](?=[A-Z]+(?:\b|[a-z]+)|[a-z]+(?:[^a-z]|$))
# Homoglyph (Cyrillic) should be `a`/`b`/`c`/`e`/`o`/`p`/`x`/`y`
# It's possible that your content is intentionally mixing Cyrillic and Latin scripts, but if it isn't, you definitely want to correct this.
[авсеорху](?=[A-Za-z]{2,})|(?<=[A-Za-z]{2})[авсеорху]|(?<=[A-Za-z])[авсеорху](?=[A-Za-z])
# Should be `neither/nor` -- or reword
(?<!do )\bnot\b([^.?!"/(](?!neither|,.*?,))+\bnor\b
# Should be `neither/nor` (plus rewording the beginning)
# This is probably a double negative...
\bnot\b[^.?!"/(]*\bneither\b[^.?!"/(]*\bnor\b
# In English, duplicated words are generally mistakes
# There are a few exceptions (e.g. "that that").
# If the highlighted doubled word pair is in:
# * code, write a pattern to mask it.
# * prose, have someone read the English before you dismiss this error.
\s([A-Z]{3,}|[A-Z][a-z]{2,}|[a-z]{3,})\s\g{-1}\s
================================================
FILE: .github/actions/spelling/patterns.txt
================================================
# See https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-patterns
^(?:Build|)Requires: [-.\w]+
"\w+"(?= instead of ")
NO_VOWELS:\s+'.+'
\b(?:e2e|k3s)(?=[a-z])
HTPASSWD='.+'
\b(?:azure|docker|kontainer)(?=[a-z])
\b(?:cluster|node)(?=[a-z]{2})
# IServiceProvider / isAThing
# - Altered to match `A`+`Foo`
(?:(?:\b|_|(?<=[a-z]))A)(?=(?:[A-Z][a-z]{2,})+(?:[A-Z\d]|\b))
\bamazon(?=[a-z])
# Automatically suggested patterns
# hit-count: 1264 file-count: 5
# ANSI color codes
(?:\\(?:u00|x)1[Bb]|\\03[1-7]|\x1b|\\u\{1[Bb]\})\[\d+(?:;\d+)*m
# hit-count: 1086 file-count: 175
# golang print-f-style functions
(?i)(?<=append|comma|debug|equal|err|error|exit|fatal|format|info|log|name|panic|print|skip|scan|string|trace|true|warn|warning|wrap|write)(?:f|ln)[ (]
# hit-count: 740 file-count: 4
# sha
sha\d+:[0-9a-f]*?[a-f]{3,}[0-9a-f]*
# hit-count: 323 file-count: 135
# imports
^import\s+(?:(?:static|type)\s+|)(?:[\w.]|\{\s*\w*?(?:,\s*(?:\w*|\*))+\s*\})+(?:\s+from (['"]).*?\g{-1}|)
# hit-count: 247 file-count: 111
# https/http/file urls
(?:\b(?:https?|ftp|file|oci)://)[-A-Za-z0-9+&@#/*%?=~_|!:,.;]+[-A-Za-z0-9+&@#/*%=~_|]
# hit-count: 111 file-count: 20
# version suffix <word>v#
(?:(?<=[A-Z]{2})V|(?<=[a-z]{2}|[A-Z]{2})v)\d+(?:\b|(?=[a-zA-Z_]))
# hit-count: 77 file-count: 9
# Library prefix
# e.g., `lib`+`archive`, `lib`+`raw`, `lib`+`unwind`
# (ignores some words that happen to start with `lib`)
(?:\b|_)[Ll]ib(?!era[lt])(?:re(?=office)|era|)(?!ero|erty|rar(?:i(?:an|es)|y))(?=[a-z])
# hit-count: 50 file-count: 14
# GitHub actions
\buses:\s+(['"]?)[-\w.]+/[-\w./]+@[-\w.]+\g{-1}
# hit-count: 44 file-count: 27
# node packages
(["'])@[^/'" ]+/[^/'" ]+\g{-1}
# hit-count: 40 file-count: 22
# C network byte conversions
(?:\d|\bh)to(?!ken)(?=[a-z])|to(?=[adhiklpun]\()
# hit-count: 29 file-count: 10
# in check-spelling@v0.0.22+, printf markers aren't automatically consumed
# printf markers
(?<!\\)\\n(?=[a-z]{2,})
# hit-count: 28 file-count: 19
# nolint
nolint:\s*[\w,]+
# hit-count: 14 file-count: 5
# uuid:
\b[0-9a-fA-F]{8}-(?:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}\b
# hit-count: 12 file-count: 3
# sha-... -- uses a fancy capture
(\\?['"]|")[0-9a-f]{40,}\g{-1}
# hit-count: 10 file-count: 7
# hex digits including css/html color classes:
(?:[\\0][xX]|\\u\{?|[uU]\+|#x?|%23|&H)[0-9_a-fA-FgGrR]*?[a-fA-FgGrR]{2,}[0-9_a-fA-FgGrR]*(?:[uUlL]{0,3}|[iu]\d+)\b
# hit-count: 10 file-count: 1
# css url wrappings
\burl\([^)]+\)
# hit-count: 9 file-count: 9
# regex choice
\((?:\?:|)[^)|]+(?<! )\|(?!(?:jq|xargs)\b)[^)| ][^)]*\)
# hit-count: 8 file-count: 2
# css fonts
\bfont(?:-family(?:[-\w+]*)|):[^;}]+
# hit-count: 7 file-count: 6
# assign regex
= /[^*].*?(?:[a-z]{3,}|[A-Z]{3,}|[A-Z][a-z]{2,}).*/[gim]*(?=\W|$)
# hit-count: 5 file-count: 3
# go install
go install(?:\s+[a-z]+\.[-@\w/.]+)+
# hit-count: 4 file-count: 4
# tar arguments
\b(?:\\n|)g?tar(?:\.exe|)(?:\s-C \S+|(?:\s+--[-a-zA-Z]+|\s+-[a-zA-Z]+|\s[ABGJMOPRSUWZacdfh-pr-xz]+\b)(?:=[^ ]*|))+
# hit-count: 4 file-count: 3
# hex runs
\b(?=(?:[a-fA-F]{0,2}\d)*[a-fA-F]{3})[0-9a-fA-F]{16,}\b
# hit-count: 3 file-count: 3
# Go regular expressions
regexp?\.MustCompile\((?:`[^`]*`|".*"|'.*')\)
# hit-count: 3 file-count: 2
# Docker images
^\s*(?i)FROM\s+\S+:\S+(?:\s+AS\s+\S+|)
# hit-count: 3 file-count: 2
# Intel intrinsics
_mm\d*_(?!dd)\w+
# hit-count: 2 file-count: 2
# JavaScript regular expressions
# javascript exec/test regex
/.{3,}?/[gim]*\.(?:exec|test)\(
# hit-count: 2 file-count: 2
# container images
image: [-\w./:@]+
# hit-count: 2 file-count: 2
# Regular expression for word breaks
\\b(?=[a-z]{2}.*/[^>])
# hit-count: 2 file-count: 1
# iSCSI iqn (approximate regex)
\biqn\.[0-9]{4}-[0-9]{2}(?:[\.-][a-z][a-z0-9]*)*\b:[\w.]+
# hit-count: 1 file-count: 1
# copyright
Copyright (?:\([Cc]\)|)(?:[-\d, ]|and)+(?: [A-Z][a-z]+ [A-Z][a-z]+,?)+
# hit-count: 1 file-count: 1
# IPv6
\b(?:[0-9a-fA-F]{0,4}:){3,7}[0-9a-fA-F]{0,4}\b
# hit-count: 1 file-count: 1
# javascript match regex
\.match\(/[^/\s"]{3,}/[gim]*\s*
# hit-count: 1 file-count: 1
# kubernetes crd patterns
^\s*pattern: .*$
# hit-count: 1 file-count: 1
# Windows Resources with accelerators
\b[A-Z]&[a-z]+\b(?!;)
# hit-count: 1 file-count: 1
# gist github
\bgist\.github\.com/[^/\s"]+/[0-9a-f]+
# hit-count: 1 file-count: 1
# marker to ignore all code on line
^.*\bno-spell-check(?:-line|)(?:\s.*|)$
# Questionably acceptable forms of `in to`
# Personally, I prefer `log into`, but people object
# https://www.tprteaching.com/log-into-log-in-to-login/
\b(?:(?:[Ll]og(?:g(?=[a-z])|)|[Ss]ign)(?:ed|ing)?) in to\b
# to opt in
\bto opt in\b
# typos in translation keys
^\s*(?:calllback|objectReferance|requriedInt):$
# pass(ed|ing) in
\bpass(?:ed|ing) in\b
# acceptable duplicates
# ls directory listings
[-bcdlpsw](?:[-r][-w][-SsTtx]){3}[\.+*]?\s+\d+\s+\S+\s+\S+\s+[.\d]+(?:[KMGT]|)\s+
# mount
\bmount\s+-t\s+(\w+)\s+\g{-1}\b
# C types and repeated CSS values
\s(auto|await|buffalo|BUG|center|div|inherit|long|LONG|nobody|none|normal|solid|thin|TODO|transparent|very)(?:\s\g{-1})+\s
# C enum and struct
\b(?:enum|struct)\s+(\w+)\s+\g{-1}\b
# go templates
\s(\w+)\s+\g{-1}\s+\`(?:graphql|inject|json|yaml):
# doxygen / javadoc / .net
(?:[\\@](?:brief|defgroup|groupname|link|t?param|return|retval)|(?:public|private|\[Parameter(?:\(.+\)|)\])(?:\s+(?:static|override|readonly|required|virtual))*)(?:\s+\{\w+\}|)\s+(\w+)\s+\g{-1}\s
# macOS file path
(?:Contents\W+|(?!iOS)/)MacOS\b
# Python package registry has incorrect spelling for macOS / Mac OS X
"Operating System :: MacOS :: MacOS X"
# "company" in Germany
\bGmbH\b
# IntelliJ
\bIntelliJ\b
# Commit message -- Signed-off-by and friends
^\s*(?:(?:Based-on-patch|Co-authored|Helped|Mentored|Reported|Reviewed|Signed-off)-by|Thanks-to): (?:[^<]*<[^>]*>|[^<]*)\s*$
# Autogenerated revert commit message
^This reverts commit [0-9a-f]{40}\.$
# ignore long runs of a single character:
\b([A-Za-z])\g{-1}{3,}\b
# Don't check names in dependabot.yml reviewers section
^\s+reviewers:\s*\[\s*"[^",]+"\s*\]
# Directives to skip the current full line (intended for extension names and
# their related account names):
^.*spellcheck-ignore-line.*$
# Don't check package names
^\s*zypper\b.*\binstall\b.*
# Allow golangci in GitHub workflows:
\buses:\s*golangci/golangci-lint-action\b
# on macOS, MacOS is used for the internal folder name within an app...
(["/])MacOS\g{-1}
# GitHub owner names should not be checked (dependency scripts)
\bgithubOwner\s*=\s*'.*?'
# Win32 constants
\bGWL_EXSTYLE\b
\bHWND_NOTOPMOST\b
\bSWP_NOMOVE\b
\bSWP_NOSIZE\b
# allow repetitive words in iptable rules
DNAT\s+.*\s+anywhere anywhere
# Image names
\bghcr\.io/[A-Za-z0-9_/.-]+(?::[A-Za-z0-9_.-]+)?\b
================================================
FILE: .github/actions/spelling/reject.txt
================================================
attache
aroynt.*
bellows?
benefitting
occurences?
.*dnt
dependan.*
developement
developp?e
Devers?
devex.*
devide
Devinn?[ae]
devisals?
devisors?
diables?
hasta?
hastat.*
immediatly
inisle
inital
linge
oer
Sorce
[Ss]pae.*
Teh
untill
untilling
venders?
wether.*
================================================
FILE: .github/actions/yarn-install/action.yaml
================================================
name: Yarn Install
description: >-
This is a composite action that does everything needed to do `yarn install`.
runs:
using: composite
steps:
# In case we're running on a self-hosted runner without `yarn` installed,
# set up NodeJS, enable `yarn`, and then handle the caching.
- uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version-file: package.json
- run: corepack enable yarn
shell: bash
- uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version-file: package.json
cache: yarn
- uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version-file: go.work
cache-dependency-path: src/go/**/go.sum
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
python-version: '3.x'
cache: pip
- run: pip install setuptools
shell: bash
- name: Install Windows dependencies
if: runner.os == 'Windows'
shell: powershell
run: .\scripts\windows-setup.ps1 -SkipVisualStudio -SkipTools
- name: Flag build for M1
if: runner.os == 'macOS' && runner.arch == 'ARM64'
run: echo "M1=1" >> "${GITHUB_ENV}"
shell: bash
- run: yarn install --immutable
shell: bash
- name: Fix electron sandbox
if: runner.os == 'Linux'
shell: bash
run: |
sudo chown root node_modules/electron/dist/chrome-sandbox
sudo chmod 04755 node_modules/electron/dist/chrome-sandbox
================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
# Maintain dependencies for GitHub Actions
- package-ecosystem: "github-actions"
directories:
- "/"
- "/.github/actions/*/"
schedule:
interval: "daily"
cooldown:
default-days: 7
open-pull-requests-limit: 12
labels: ["component/dependencies"]
# Maintain dependencies for npm
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "daily"
cooldown:
default-days: 7
open-pull-requests-limit: 12
labels: ["component/dependencies"]
ignore:
- # Needs to be updated along with NodeJS version.
dependency-name: "@types/node"
update-types: [version-update:semver-major]
- # We don't utilize @rancher/shell in a meaningful way. It is safe to
# ignore until we arrive a solution that uses it.
dependency-name: "@rancher/shell"
versions: [">0.1"]
# Maintain dependencies for Golang
- package-ecosystem: "gomod"
directories:
- "/src/go/*"
- "/src/go/**/*"
- "/scripts"
schedule:
interval: "daily"
# cooldown:
# default-days: 7
open-pull-requests-limit: 12
labels: ["component/dependencies"]
ignore:
- # Swagger dependencies must match whatever the CLI generate.
dependency-name: "github.com/go-openapi/swag"
groups:
golang-x:
patterns: ["golang.org/x/*"]
k8s:
patterns: ["k8s.io/*"]
================================================
FILE: .github/workflows/bats/get-tests.py
================================================
#!/usr/bin/env python3
# This script determines the tests to be run.
# Inputs (as environment variables, all are space-separated):
# TESTS The set of tests to run (e.g. "*", "containers k8s")
# PLATFORMS The set of platforms (e.g. "linux mac")
# ENGINES The set of engines (e.g. "containerd moby")
# KUBERNETES_VERSION The default Kubernetes version to use
# KUBERNETES_ALT_VERSION Alternative Kubernetes version for coverage
# The working directory must be the "bats/tests/" folder
import dataclasses
import glob
import json
from operator import attrgetter
import os
import sys
from typing import Iterator, List, Literal, get_args
Platforms = Literal["linux", "mac", "win"]
Hosts = Literal["ubuntu-latest", "macos-15-intel", "windows-latest"]
Engines = Literal["containerd", "moby"]
@dataclasses.dataclass
class Result:
"""
A Result describes a test run, which is a matrix entry.
"""
# The name of the test; either a directory or a file name (without extension)
name: str
host: Hosts
engine: Engines
# The version of k3s to test
k3sVersion: str
# A different Kubernetes version, for testing upgrades.
k3sAltVersion: str
key = staticmethod(attrgetter("name", "host", "engine"))
def resolve_test(test: str, platform: Platforms) -> Iterator[str]:
"""
Given a test spec, convert that to a list of tests.
"""
# If we can't glob the test, use it as-is.
for test in glob.glob(test) or (test,):
if platform == "mac" and test == "k8s":
# The macOS runners on CI are extra slow; for this test suite,
# run each test individually.
for name in glob.glob("k8s/*.bats"):
yield name.removesuffix(".bats")
else:
yield test.removesuffix(".bats")
def skip_test(test: Result) -> bool:
"""
Check if a given test should be skipped.
We skip some tests because the CI machines can't handle them.
"""
if test.host == "macos-15-intel" and test.name.startswith("k8s/"):
# The macOS CI runners are slow; skip some tests that can be tested on
# other OSes.
skipped_tests = ("verify-cached-images",)
if any(test.name == f"k8s/{t}" for t in skipped_tests):
return True
return False
results: List[Result] = list()
errors: bool = False
for test in (os.environ.get("TESTS", None) or "*").split():
platforms: List[Platforms] = os.environ.get("PLATFORMS", "").split() or get_args(Platforms)
engines: List[Engines] = os.environ.get("ENGINES", "").split() or get_args(Engines)
for platform in platforms:
host: Hosts = {
"linux": "ubuntu-latest",
"mac": "macos-15-intel",
"win": "windows-latest",
}[platform]
for name in resolve_test(test, platform):
for engine in engines:
if os.access(name, os.R_OK):
pass
elif os.access(f"{name}.bats", os.R_OK):
name = f"{name}.bats"
else:
errors = True
print(f"Failed to find test {name}", file=sys.stderr)
continue
# To get some coverage of different Kubernetes versions, pick the
# version depending on the container engine; one gets the old version
# we previously tested, the other gets the maximum version
# of k3s that is supported by the Rancher helm chart. These values
# come from the environment.
k3sVersion = os.environ.get("KUBERNETES_VERSION", "")
k3sAltVersion = os.environ.get("KUBERNETES_ALT_VERSION", "")
if k3sVersion == "" or k3sAltVersion == "":
raise "Either KUBERNETES_VERSION or KUBERNETES_ALT_VERSION is unset"
if engine == "containerd":
(k3sAltVersion, k3sVersion) = (k3sVersion, k3sAltVersion)
result = Result(name=name, host=host, engine=engine,
k3sVersion=k3sVersion, k3sAltVersion=k3sAltVersion)
if not skip_test(result):
results.append(result)
dicts = [dataclasses.asdict(x) for x in sorted(results, key=Result.key)]
output = os.environ.get("GITHUB_OUTPUT", None)
if output is not None:
with open(output, "a") as file:
print(f"tests={json.dumps(dicts)}", file=file)
json.dump(dicts, sys.stdout, indent=2)
if errors:
raise FileNotFoundError("Some tests were not found")
================================================
FILE: .github/workflows/bats/sanitize-artifact-name.sh
================================================
#!/bin/bash
set -o errexit -o nounset -o pipefail
# GitHub restricts artifact filenames:
# Invalid characters include: Double quote ", Colon :, Less than <,
# Greater than >, Vertical bar |, Asterisk *, Question mark ?, Carriage
# return \r, Line feed \n
#
# The following characters are not allowed in files that are uploaded
# due to limitations with certain file systems such as NTFS. To maintain
# file system agnostic behavior, these characters are intentionally not
# allowed to prevent potential problems with downloads on different file
# systems.
# By default, this script takes a string on standard input and outputs the
# sanitized string on standard output. If any positional parameters are given,
# it instead treats them as file names to (recursively) rename.
sanitize() {
local new=$1
new=${new//\"/%22}
new=${new//:/%3A}
new=${new//</%3C}
new=${new//>/%3E}
new=${new//|/%7C}
new=${new//\*/%2A}
new=${new//\?/%3F}
new=${new//$'\r'/}
new=${new//$'\n'/}
echo "$new"
}
if [[ ${#@} -lt 1 ]]; then
# No arguments; sanitize standard input.
sanitize "$(cat)"
exit
fi
# Find all files and put the names into the FILES array.
# We don't rename inside the loop to make sure the find command has
# finished before we modify any directories it is iterating over.
FILES=()
for PARAM in "$@"; do
while read -d $'\0' -r FILE; do
FILES+=("$FILE")
done < <(find "$PARAM" -type f -print0)
done
for FILE in "${FILES[@]}"; do
NEW="$(sanitize "$FILE")"
if [[ $FILE != "$NEW" ]]; then
echo "$NEW"
mv "$FILE" "$NEW"
fi
done
================================================
FILE: .github/workflows/bats/summarize.mjs
================================================
// This file creates the summary table at the end of the run.
//
// Inputs:
// */version.txt -- The version of Rancher Desktop tested
// */name.txt -- The test suite that was ran
// */os.txt -- The OS the test was run on
// */engine.txt -- The container engine used
// */log-name.txt -- The name of the logs artifact
// */report.tap -- The results
// Environment:
// GITHUB_API_URL, GITHUB_RUN_ID, GITHUB_REPOSITORY, GITHUB_SERVER_URL
// See https://docs.github.com/en/actions/learn-github-actions/variables#default-environment-variables
// GITHUB_TOKEN
// GitHub authorization token.
// @ts-check
import fs from 'fs';
import path from 'path';
/**
* Define interface for emitting one line of output.
* @typedef {(line: string) => unknown} OutputMethod
*/
class Run {
/** Contents of version.txt. */
versionData = '';
/** Contents of name.txt. */
name = '';
/** Contents of os.txt. */
os = '';
/** Contents of engine.txt. */
engine = '';
/** Contents of log-name.txt. */
logName = '';
/** Total number of tests. */
total = 0;
/** Number of tests passed (not skipped). */
passed = 0;
/** Number of tests skipped. */
skipped = 0;
/** Number of tests failed. */
failed = 0;
/** Job ID; this may not be set. */
id = 0;
/** ID for the logs artifact; might be missing. */
logId = 0;
/** Number of tests passed or skipped. */
get ok() { return this.passed + this.skipped };
/** Whether this run succeeded. */
get succeeded() { return this.ok == this.total };
/** Version string for this run. */
get version() {
let v = this.versionData;
for (const prefix of ['Rancher Desktop-', 'rancher-desktop-', 'Rancher.Desktop.Setup.']) {
if (v.startsWith(prefix)) {
v = v.substring(prefix.length);
}
}
const suffixes = ['.msi'];
for (const platform of ['linux', 'arm64-mac', 'mac', 'win']) {
suffixes.push(`-${ platform }.zip`);
}
for (const suffix of suffixes) {
if (v.endsWith(suffix)) {
v = v.substring(0, v.length - suffix.length);
}
}
return v;
}
/** The column for this run. */
get column() { return `${ this.os } ${ this.engine }` }
}
/**
* Read the runs in the current directory.
* @returns {Promise<Run[]>}
*/
async function readRuns() {
/** @type Run[] */
const runs = [];
for (const entry of await fs.promises.readdir('.', { withFileTypes: true })) {
if (!entry.isDirectory()) {
continue;
}
try {
/**
* Return the contents of a file relative to the entry directory.
* @param {string} relPath The name of the file to read.
* @returns {Promise<string>} Trimmed contents of the file.
*/
async function readFile(relPath) {
const fullPath = path.join(entry.name, relPath);
return (await fs.promises.readFile(fullPath, { encoding: 'utf-8' })).trimEnd();
}
const run = new Run();
run.versionData = await readFile('version.txt');
run.name = await readFile('name.txt');
run.os = await readFile('os.txt');
run.engine = await readFile('engine.txt');
run.logName = await readFile('log-name.txt');
const report = await fs.promises.open(path.join(entry.name, 'report.tap'));
for await (const line of report.readLines()) {
if (line.startsWith('1..')) {
run.total = parseInt(line.substring(3), 10);
} else if (line.toLowerCase().includes(' # skip')) {
run.skipped++;
} else if (line.startsWith('ok ')) {
run.passed++;
} else if (line.startsWith('no ok ')) {
run.failed++;
}
}
runs.push(run);
} catch (ex) {
// We might be reading `.git`, `.github`, etc; don't abort if we failed to
// read anything, but record the error for debugging purposes.
console.error(`Failed to read ${ entry.name }:`, ex);
}
}
// We don't have job ID and artifact ID from the recorded data (because those
// are not available to the jobs as they are run); try to fetch them.
await updateRunInfo(runs);
return runs;
}
/**
* Print the version string table.
* @param {Run[]} runs The runs collected.
* @param {OutputMethod} output Function to output a line.
*/
async function printVersions(runs, output) {
/** @type Set<string> */
const versions = new Set();
for (const run of runs) {
versions.add(run.version);
}
output('Versions\n---');
for (const version of Array.from(versions).sort()) {
output('`' + version + '`');
}
output('');
}
/**
* Minimal structure of a /jobs API return.
* @typedef {Object} GitHubWorkflowJobList
* @property {GitHubWorkflowRunJob[]} jobs
*/
/**
* @typedef {Object} GitHubWorkflowRunJob
* @property {number} id
* @property {string} name
*/
/**
* Minimal structure of a /artifacts API return.
* @typedef {Object} GitHubWorkflowArtifactsList
* @property {GitHubWorkflowArtifact[]} artifacts
*/
/**
* @typedef {Object} GitHubWorkflowArtifact
* @property {number} id
* @property {string} name
*/
/**
* Fetch GitHub metadata about the current run.
* @param {'jobs' | 'artifacts'} infoType The information to get.
* @returns {Promise<any | undefined>} The data from API, or undefined.
*/
async function getRunMetadata(infoType) {
const { env } = process;
const variables = [
'GITHUB_API_URL', 'GITHUB_RUN_ID', 'GITHUB_REPOSITORY',
];
for (const variable of variables) {
if (!(variable in env)) {
console.error(`${ variable } not set, skipping GitHub API calls`);
return;
}
}
const url = `${ env.GITHUB_API_URL }/repos/${ env.GITHUB_REPOSITORY }/actions/runs/${ env.GITHUB_RUN_ID }/${ infoType }?per_page=100`;
/** @type Record<string, string> */
const headers = {};
if ('GITHUB_TOKEN' in env) {
headers.Authorization = `Bearer ${ env.GITHUB_TOKEN }`;
}
const response = await fetch(url, { headers })
if (!response.ok) {
throw new Error(`Failed to get GitHub ${ infoType } info:` + await response.text());
}
return await response.json();
}
/**
* Update runs in place with metadata from GitHub.
* @param {Run[]} runs The runs to modify.
*/
async function updateRunInfo(runs) {
/** @type GitHubWorkflowJobList | undefined */
const jobInfo = await getRunMetadata('jobs');
if (jobInfo) {
// Parse the info to get a list of job matrix values to job ID.
// Because there may be more values than the ones we're looking for, we can't
// just make it a Map.
const jobMap = jobInfo.jobs.map(job => {
const name = (/\((.*)\)/.exec(job.name) ?? [])[1];
const vals = new Set((name?.split(',') ?? []).map(n => n.trim()));
return /** @type {const} */([vals, job.id]);
});
for (const run of runs) {
const [, id]= jobMap.find(([vals]) => {
return vals.has(run.name) && vals.has(run.os) && vals.has(run.engine);
}) ?? [];
if (id) {
run.id = id;
}
}
}
/** @type GitHubWorkflowArtifactsList | undefined */
const artifactInfo = await getRunMetadata('artifacts');
if (artifactInfo) {
const artifactMap = Object.fromEntries(artifactInfo.artifacts.map(a => [a.name, a.id]));
for (const run of runs) {
if (run.logName in artifactMap) {
run.logId = artifactMap[run.logName];
}
}
}
}
/**
* Print the result table
* @param {Run[]} runs The runs collected
* @param {OutputMethod} output Function to output a line
*/
async function printResults(runs, output) {
if (!process.env.EXPECTED_TESTS) {
throw new Error('EXPECTED_TESTS was not set');
}
/** @type {{name: string, host: string, engine: string}[]} */
const expectedTests = JSON.parse(process.env.EXPECTED_TESTS);
const expectedNames = Array.from(new Set(expectedTests.map(t => t.name))).sort();
const expectedHosts = Array.from(new Set(expectedTests.map(t => t.host))).sort();
const expectedColumns = expectedHosts.map(host => {
const engines = new Set(expectedTests.filter(t => t.host === host).map(t => t.engine));
return Array.from(engines).sort().map(engine => [host, engine]);
}).flat(1);
output(['Name', ...expectedColumns.map(parts => parts.join(' '))].join(' | '));
output(['', ...expectedColumns].map(() => '---').join(' | '));
for (const name of expectedNames) {
const row = [name];
for (const [host, engine] of expectedColumns) {
const run = runs.find(r => r.name === name && r.os === host && r.engine === engine);
const expected = expectedTests.find(t => t.name === name && t.host === host && t.engine === engine);
if (run) {
const emoji = run.succeeded ? ':white_check_mark:' : ':x:';
const count = run.succeeded ? '' : `${ run.ok }/${ run.total }`;
let tooltip = '';
tooltip += run.passed ? `${ run.passed } passed ` : '';
tooltip += run.failed ? `${ run.failed } failed ` : '';
tooltip += run.skipped ? `${ run.skipped } skipped ` : '';
tooltip += `out of ${ run.total }`;
const { env } = process;
let result = '';
if (run.logId) {
const url = `${ env.GITHUB_SERVER_URL }/${ env.GITHUB_REPOSITORY }/actions/runs/${ env.GITHUB_RUN_ID}/artifacts/${ run.logId }`;
result += `<a href="${ url }" title="Download logs">:file_folder:</a> `;
}
result += `<a title="${ tooltip }"`;
if (run.id) {
const url = `${ env.GITHUB_SERVER_URL }/${ env.GITHUB_REPOSITORY }/actions/runs/${ env.GITHUB_RUN_ID }/job/${ run.id }`;
result += ` href="${ url }"`;
}
result += `>${ emoji } ${ count }</a>`;
row.push(result);
} else if (expected) {
// The test result is missing for this run.
row.push('<a title="run results missing">:x: ??</a>');
} else {
// This combination is not run.
row.push('');
}
}
output(row.join(' | '));
}
}
(async() => {
const runs = await readRuns();
for (const run of runs) {
console.log(run);
}
/** @type {OutputMethod} */
let output = console.log;
if (process.env.GITHUB_STEP_SUMMARY) {
const file = await fs.promises.open(process.env.GITHUB_STEP_SUMMARY, 'a');
output = (line) => file.write(line + '\n');
}
await printVersions(runs, output);
await printResults(runs, output);
})().catch(ex => {
console.error(ex);
process.exit(1);
});
================================================
FILE: .github/workflows/bats.yaml
================================================
name: BATS
on:
workflow_dispatch:
inputs:
owner:
description: Override owner (e.g. rancher-sandbox)
type: string
repo:
description: Override repository (e.g. rancher-desktop)
type: string
branch:
description: Override branch (e.g. main, or PR#)
type: string
tests:
description: 'Tests (in the tests/ directory, e.g. "containers")'
default: '*'
type: string
platforms:
description: Platforms to run
default: 'linux mac win'
type: string
engines:
description: Container engines to run
default: 'containerd moby'
type: string
kubernetes-version:
description: Primary Kubernetes version to test
default: '1.22.7' # Must also change in calculate step
type: string
kubernetes-alt-version:
description: Secondary Kubernetes version to test (e.g. for upgrades)
default: '1.28.11' # Must also change in calculate step
type: string
package-id:
description: Package run ID override; leave empty to use latest.
default: ''
type: string
experimental:
description: Run with experimental settings (WSL)
default: false
type: boolean
schedule:
- cron: '0 8 * * 1-5' # 8AM UTC weekdays as a baseline
permissions:
contents: read
env:
GH_OWNER: ${{ github.repository_owner }}
GH_REPOSITORY: ${{ github.repository }}
GH_REF_NAME: ${{ github.ref_name }}
jobs:
get-tests:
name: Calculate tests to run
runs-on: ubuntu-latest
steps:
- name: Fetch install script
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
sparse-checkout-cone-mode: false
sparse-checkout: |
scripts/install-latest-ci.sh
.github/workflows/bats/get-tests.py
- id: repo
name: Calculate short repository
run: echo "repo=${GITHUB_REPOSITORY#*/}" >> "$GITHUB_OUTPUT"
- name: Fetch tests
run: |
: ${OWNER:=$GH_OWNER}
: ${REPO:=${GH_REPOSITORY#$GH_OWNER/}}
: ${BRANCH:=$GH_REF_NAME}
# If BRANCH is a number, assume it is supposed to be a PR
[[ $BRANCH =~ ^[0-9]+$ ]] && export PR=$BRANCH
"scripts/install-latest-ci.sh"
env:
GH_TOKEN: ${{ github.token }}
OWNER: ${{ inputs.owner || github.repository_owner }}
REPO: ${{ inputs.repo || steps.repo.outputs.repo }}
BRANCH: ${{ inputs.branch || github.ref_name }}
ID: ${{ inputs.package-id }}
BATS_DIR: ${{ github.workspace }}/bats
INSTALL_MODE: skip
- name: Calculate tests
id: calculate
# This script is not inline to make local testing easier
run: python3 ${{ github.workspace }}/.github/workflows/bats/get-tests.py
env:
TESTS: ${{ inputs.tests }}
PLATFORMS: ${{ inputs.platforms }}
ENGINES: ${{ inputs.engines }}
KUBERNETES_VERSION: ${{ inputs.kubernetes-version || '1.22.7' }}
# rancher/rancher helm chart 2.8.5 supports up to 1.28.*
KUBERNETES_ALT_VERSION: ${{ inputs.kubernetes-alt-version || '1.28.11' }}
working-directory: bats/tests
outputs:
repo: ${{ steps.repo.outputs.repo }}
tests: ${{ steps.calculate.outputs.tests }}
bats:
needs: get-tests
strategy:
fail-fast: false
matrix:
include: ${{ fromJSON(needs.get-tests.outputs.tests )}}
runs-on: ${{ matrix.host }}
steps:
- name: Fetch install script
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
sparse-checkout-cone-mode: false
sparse-checkout: |
scripts/install-latest-ci.sh
.github/actions/setup-environment/action.yaml
.github/workflows/bats/sanitize-artifact-name.sh
- name: Install latest CI build
run: |
: ${OWNER:=$GH_OWNER}
: ${REPO:=${GH_REPOSITORY#$GH_OWNER/}}
: ${BRANCH:=$GH_REF_NAME}
# If BRANCH is a number, assume it is supposed to be a PR
[[ $BRANCH =~ ^[0-9]+$ ]] && export PR=$BRANCH
scripts/install-latest-ci.sh
shell: bash
env:
GH_TOKEN: ${{ github.token }}
OWNER: ${{ inputs.owner || github.repository_owner }}
REPO: ${{ inputs.repo || needs.get-tests.outputs.repo }}
BRANCH: ${{ inputs.branch || github.ref_name }}
ID: ${{ inputs.package-id }}
BATS_DIR: ${{ github.workspace }}/bats
INSTALL_MODE: installer
ZIP_NAME: ${{ github.workspace }}/version.txt
RD_LOCATION: system
- name: Set up environment
uses: ./.github/actions/setup-environment
- name: "Linux: Install prerequisites"
if: runner.os == 'Linux'
run: >-
sudo DEBIAN_FRONTEND=noninteractive
apt-get install coreutils
- name: "macOS: Install prerequisites"
if: runner.os == 'macOS'
shell: bash
run: brew install --force bash coreutils
- name: "Windows: Install WSL2 Distribution"
if: runner.os == 'Windows'
shell: pwsh
run: |
# Install a "modern" WSL distribution
wsl --install --no-launch --web-download --name openSUSE openSUSE-Leap-15.6
# Prevent first-boot from running
wsl --distribution openSUSE --user root --exec sed -i -e '/^command/d' /etc/wsl-distribution.conf
# Create the initial user
wsl --distribution openSUSE --user root --exec /usr/sbin/useradd --create-home --uid 1000 user
- name: "Windows: Install prerequisites in WSL"
if: runner.os == 'Windows'
shell: pwsh
run: >-
wsl.exe --distribution openSUSE --user root --exec
zypper --non-interactive install
curl
util-linux
- name: "Windows: Enable experimental WSL settings"
if: runner.os == 'Windows' && inputs.experimental
shell: pwsh
run: |
Set-Content -Encoding UTF8NoBOM -Path "${HOME}/.wslconfig" -Value @"
; Note that not all settings here make sense together.
[wsl]
dnsProxy=false
; networkingMode=mirrored ; https://github.com/rancher-sandbox/rancher-desktop/issues/6665
firewall=true
dnsTunneling=true
autoProxy=true
[experimental]
autoMemoryReclaim=gradual
sparseVhd=true
useWindowsDnsCache=true
bestEffortDnsParsing=true
hostAddressLoopback=true
"@
- name: Set log directory
shell: bash
run: |
echo "LOGS_DIR=$(pwd)/logs" >> "$GITHUB_ENV"
mkdir logs
- name: "Windows: Override log directory"
if: runner.os == 'Windows'
shell: powershell
run: >-
wsl.exe --distribution openSUSE -- echo 'LOGS_DIR=$(pwd)'
| Out-File -Encoding ASCII -Append "$ENV:GITHUB_ENV"
working-directory: logs
- name: Normalize test name
id: normalize
shell: bash
run: |
t="${{ matrix.name }}"
if [[ ! -r "tests/$t" ]] && [[ -r "tests/${t}.bats" ]]; then
t="${t}.bats"
fi
echo "test=$t" >> "$GITHUB_OUTPUT"
working-directory: bats
- name: "macOS: Set startup command"
if: runner.os == 'macOS'
run: echo "BATS_COMMAND=$BATS_COMMAND" >> "$GITHUB_ENV"
env:
BATS_COMMAND: exec
- name: "Linux: Set startup command"
if: runner.os == 'Linux'
run: echo "BATS_COMMAND=$BATS_COMMAND" >> "$GITHUB_ENV"
env:
BATS_COMMAND: >-
exec xvfb-run --auto-servernum
--server-args='-screen 0 1280x960x24'
- name: "Windows: Set startup command"
if: runner.os == 'Windows'
shell: bash
run: echo "BATS_COMMAND=$BATS_COMMAND" >> "$GITHUB_ENV"
env:
BATS_COMMAND: wsl.exe --distribution openSUSE --exec
- name: Run BATS
# We use ${{ env.BATS_COMMAND }} instead of ${BATS_COMMAND} to let the
# shell parse the command, instead of doing it via expansion which is then
# parsed differently (--server-args isn't kept as one word). Also, we
# need to use the env.* form because PowerShell uses ${ENV:VAR} instead.
run: >-
${{ env.BATS_COMMAND }}
./bats-core/bin/bats
--gather-test-outputs-in '${{ env.LOGS_DIR }}'
--print-output-on-failure
--filter-tags '!ci-skip'
--formatter cat
--report-formatter tap
'tests/${{ steps.normalize.outputs.test }}'
env:
BATS_COMMAND: ${{ env.BATS_COMMAND }}
GITHUB_TOKEN: ${{ github.token }}
LOGS_DIR: ${{ env.LOGS_DIR }}
RD_CAPTURE_LOGS: "true"
RD_CONTAINER_ENGINE: ${{ matrix.engine }}
RD_KUBERNETES_VERSION: ${{ matrix.k3sVersion }}
RD_KUBERNETES_ALT_VERSION: ${{ matrix.k3sAltVersion }}
RD_TAKE_SCREENSHOTS: "true"
RD_TRACE: "true"
RD_USE_GHCR_IMAGES: "true"
RD_USE_RAMDISK: "true"
RD_USE_WINDOWS_EXE: "${{ runner.os == 'Windows' }}"
WSLENV: "\
GITHUB_TOKEN:\
RD_CAPTURE_LOGS:\
RD_CONTAINER_ENGINE:\
RD_KUBERNETES_VERSION:\
RD_KUBERNETES_ALT_VERSION:\
RD_TAKE_SCREENSHOTS:\
RD_TRACE:\
RD_USE_GHCR_IMAGES:\
RD_USE_RAMDISK:\
RD_USE_WINDOWS_EXE:\
"
working-directory: bats
timeout-minutes: 120
- name: Calculate log name
id: log_name
if: ${{ !cancelled() }}
run: |
name="$(.github/workflows/bats/sanitize-artifact-name.sh <<< "$name")"
# For the artifact name, backslash and forward slash are also invalid.
name=${name//\\/%3C}
name=${name//\//%2F}
echo "name=$name" >>"$GITHUB_OUTPUT"
shell: bash
env:
name: ${{ matrix.host }}-${{ matrix.engine }}-${{ matrix.name }}.logs
- name: Consolidate logs
if: ${{ !cancelled() }}
run: |
# bats/logs may not exist if the workflow is being tested with e.g. tests/helpers/utils.bats
if [ -d "bats/logs" ]; then
cp -R "bats/logs/" logs
fi
cp "bats/report.tap" logs
.github/workflows/bats/sanitize-artifact-name.sh logs
echo "$NAME" > logs/name.txt
echo "$OS" > logs/os.txt
echo "$ENGINE" > logs/engine.txt
echo "$LOG_NAME" > logs/log-name.txt
mv version.txt logs/
shell: bash
env:
NAME: ${{ matrix.name }}
OS: ${{ matrix.host }}
ENGINE: ${{ matrix.engine }}
LOG_NAME: ${{ steps.log_name.outputs.name }}
- name: Upload logs
if: ${{ !cancelled() }}
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: ${{ steps.log_name.outputs.name }}
path: logs/
if-no-files-found: error
summarize:
name: Summarize output
needs: [ get-tests, bats ]
if: ${{ !cancelled() }}
runs-on: ubuntu-latest
steps:
- name: Fetch summarizer script
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
sparse-checkout-cone-mode: false
sparse-checkout: |
package.json
.github/workflows/bats/summarize.mjs
- uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version-file: package.json
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
pattern: "*.logs"
- run: node .github/workflows/bats/summarize.mjs
env:
EXPECTED_TESTS: ${{ needs.get-tests.outputs.tests }}
================================================
FILE: .github/workflows/codeql.yaml
================================================
name: "CodeQL Advanced"
on:
push:
branches: ["main", "release*"]
pull_request:
branches: ["main", "release*"]
schedule:
- cron: '33 19 * * 5'
workflow_dispatch:
jobs:
analyze:
name: Analyze (${{ matrix.language }})
# Runner size impacts CodeQL analysis time. To learn more, please see:
# - https://gh.io/recommended-hardware-resources-for-running-codeql
# - https://gh.io/supported-runners-and-hardware-resources
# - https://gh.io/using-larger-runners (GitHub.com only)
# Consider using larger runners or machines with greater resources for possible analysis time improvements.
runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }}
permissions:
# required for all workflows
security-events: write
# required to fetch internal or private CodeQL packs
packages: read
# only required for workflows in private repositories
actions: read
contents: read
strategy:
fail-fast: false
matrix:
include:
- language: go
build-mode: autobuild
- language: javascript-typescript
build-mode: none
# CodeQL supports the following values keywords for 'language': 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift'
# Use `c-cpp` to analyze code written in C, C++ or both
# Use 'java-kotlin' to analyze code written in Java, Kotlin or both
# Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both
# To learn more about changing the languages that are analyzed or customizing the build mode for your analysis,
# see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning.
# If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how
# your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@0499de31b99561a6d14a36a5f662c2a54f91beee # v4.31.2
with:
languages: ${{ matrix.language }}
build-mode: ${{ matrix.build-mode }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
# queries: security-extended,security-and-quality
# If the analyze step fails for one of the languages you are analyzing with
# "We were unable to automatically build your code", modify the matrix above
# to set the build mode to "manual" for that language. Then modify this step
# to build your code.
# ℹ️ Command-line programs to run using the OS shell.
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
- if: matrix.build-mode == 'manual'
shell: bash
run: |
echo 'If you are using a "manual" build mode for one or more of the' \
'languages you are analyzing, replace this with the commands to build' \
'your code, for example:'
echo ' make bootstrap'
echo ' make release'
exit 1
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@0499de31b99561a6d14a36a5f662c2a54f91beee # v4.31.2
with:
category: "/language:${{matrix.language}}"
================================================
FILE: .github/workflows/docker-cli-monitor.yaml
================================================
name: Check for new releases of docker/cli
on:
schedule:
- cron: '55 8 * * *'
workflow_dispatch: {}
jobs:
check-for-token:
outputs:
has-token: ${{ steps.calc.outputs.HAS_SECRET }}
runs-on: ubuntu-latest
steps:
- id: calc
run: echo "HAS_SECRET=${HAS_SECRET}" >> "${GITHUB_OUTPUT}"
env:
HAS_SECRET: ${{ secrets.RUN_WORKFLOW_FROM_WORKFLOW != '' }}
check-docker-cli:
needs: check-for-token
if: needs.check-for-token.outputs.has-token == 'true'
runs-on: ubuntu-latest
permissions:
issues: write
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- uses: ./.github/actions/yarn-install
- run: yarn dcmonitor
env:
GITHUB_CREATE_TOKEN: ${{ secrets.RUN_WORKFLOW_FROM_WORKFLOW }}
GITHUB_TOKEN: ${{ github.token }}
================================================
FILE: .github/workflows/k3s-versions.yaml
================================================
name: Update k3s-versions.json
on:
schedule:
- cron: '43 8 * * *'
workflow_dispatch: {}
permissions:
contents: write
pull-requests: write
jobs:
check-for-token:
outputs:
has-token: ${{ steps.calc.outputs.HAS_SECRET }}
runs-on: ubuntu-latest
steps:
- id: calc
run: echo "HAS_SECRET=${HAS_SECRET}" >> "${GITHUB_OUTPUT}"
env:
HAS_SECRET: ${{ secrets.RUN_WORKFLOW_FROM_WORKFLOW != '' }}
check-update-versions:
needs: check-for-token
if: needs.check-for-token.outputs.has-token == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
# we may need to checkout an existing branch, so need the full history
fetch-depth: 0
# Setup go to be able to run `go run ./scripts/k3s-version.go`
- uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version-file: go.work
- run: ./scripts/k3s-versions.sh
env:
GITHUB_TOKEN: ${{ secrets.RUN_WORKFLOW_FROM_WORKFLOW }}
================================================
FILE: .github/workflows/linux-e2e.yaml
================================================
name: e2e tests on Linux
on:
workflow_dispatch:
push:
branches-ignore:
- 'dependabot/**'
pull_request: {}
jobs:
check-paths:
uses: ./.github/workflows/paths-ignore.yaml
e2e-tests:
needs: check-paths
if: needs.check-paths.outputs.should-run == 'true'
timeout-minutes: 150
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- uses: ./.github/actions/yarn-install
- name: Disable admin-access before start up
run: |
mkdir -p $HOME/.config/rancher-desktop
cat <<EOF > $HOME/.config/rancher-desktop/settings.json
{
"version": 5,
"application": {
"adminAccess": false
}
}
EOF
- name: Enable kvm access
run: sudo chmod a+rwx /dev/kvm
- name: Run e2e Tests
continue-on-error: false
run: >-
xvfb-run --auto-servernum --server-args='-screen 0 1280x960x24'
yarn test:e2e
env:
RD_DEBUG_ENABLED: '1'
CI: true
timeout-minutes: 150
- name: Upload failure reports
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
if: always()
with:
name: failure-reports.zip
path: ./e2e/reports/*
- name: Clean up test environment
run: |
rm -f $HOME/.config/rancher-desktop.defaults.json
rm -f $HOME/.config/rancher-desktop.locked.json
if: always()
================================================
FILE: .github/workflows/linux-release.yaml
================================================
name: Upload Linux release
on:
release:
types:
- published
workflow_dispatch: {}
defaults:
run:
shell: bash
jobs:
linux-release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
fetch-depth: 0
- name: Populate necessary env vars
run: |
# get the env vars
version_with_v=${GITHUB_REF#"refs/tags/"}
release_zip_name="rancher-desktop-linux-${version_with_v}.zip"
major_minor=$(echo ${version_with_v} | sed -E 's/v([0-9]+\.[0-9]+)\.[0-9]+.*/\1/g')
s3_zip_name="rancher-desktop-linux-${major_minor}.zip"
# make variables available in subsequent steps
echo "version_with_v=$version_with_v" >> $GITHUB_ENV
echo "release_zip_name=$release_zip_name" >> $GITHUB_ENV
echo "major_minor=$major_minor" >> $GITHUB_ENV
echo "s3_zip_name=$s3_zip_name" >> $GITHUB_ENV
- run: mkdir -p dist
- name: Fetch the .zip file from release
run: >-
curl -L -o "dist/${release_zip_name}"
"https://github.com/${repository}/releases/download/${version_with_v}/${release_zip_name}"
env:
repository: ${{ github.repository }}
version_with_v: ${{ env.version_with_v }}
release_zip_name: ${{ env.release_zip_name }}
- name: Upload zip file to S3
run: >-
aws s3 cp
"dist/${release_zip_name}"
"s3://rancher-desktop-assets-for-obs/${s3_zip_name}"
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_DEFAULT_REGION: us-east-1
release_zip_name: ${{ env.release_zip_name }}
s3_zip_name: ${{ env.s3_zip_name }}
- name: Trigger OBS services for relevant package in stable channel
run: >-
curl -X POST
-H "Authorization: Token ${OBS_WEBHOOK_TOKEN}"
"https://build.opensuse.org/trigger/runservice?project=isv:Rancher:stable&package=rancher-desktop-${MAJOR_MINOR}"
env:
MAJOR_MINOR: ${{ env.major_minor }}
OBS_WEBHOOK_TOKEN: ${{ secrets.OBS_WEBHOOK_TOKEN }}
================================================
FILE: .github/workflows/macM1-e2e.yaml
================================================
name: e2e tests on Mac M1
on:
workflow_dispatch:
schedule:
- cron: '15 8 * * 1-5'
jobs:
e2e-tests:
timeout-minutes: 45
runs-on: [self-hosted, macos-latest, arm64]
env:
M1: 1
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
ref: main
- uses: ./.github/actions/yarn-install
- name: Disable admin-access before start up
run: |
mkdir -p $HOME/Library/Preferences/rancher-desktop
touch $HOME/Library/Preferences/rancher-desktop/settings.json
cat <<EOF > $HOME/Library/Preferences/rancher-desktop/settings.json
{
"version": 5,
"application": {
"adminAccess": false
"updater": { "enabled": false },
},
"virtualMachine" {
"memoryInGB": 6,
},
"pathManagementStrategy": "rcfiles"
}
EOF
- name: Run Rancher Desktop in dev
run: |
yarn dev -- --no-modal-dialogs &
sleep 200
$HOME/.rd/bin/rdctl shutdown
wait
- name: Run e2e Tests
continue-on-error: false
run: yarn test:e2e
- name: Failed tests
if: failure()
run: mkdir -p ./e2e/reports
- name: Upload Artifacts
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
if: failure()
with:
name: e2etest-artifacts
path: ./e2e/reports/*
- name: Cleanup test environment
run: |
#set -x
cd $HOME/Library
pushd Logs/rancher-desktop
for x in *.log ; do
echo -n '' > $x
done
popd
rm -fr "Application Support/rancher-desktop"
rm -fr Preferences/rancher-desktop
rm -fr Caches/rancher-desktop/k3s-versions.json
cd $HOME/.rd/bin
for x in helm kubectl nerdctl docker ; do
if [[ -L $x ]] ; then # && $(readlink $x):]] ; then
rm -f $x
fi
done
if: always()
- name: End stray processes
run: |
ps auxww | grep qemu
ps auxww | grep rancher | grep -vi -e goland
if: always()
================================================
FILE: .github/workflows/package.yaml
================================================
name: Package
on:
pull_request:
paths-ignore:
- '.github/actions/spelling/**'
- 'docs/**'
- '**.md'
push:
branches:
- main
- release-*
tags:
- '*'
workflow_dispatch:
inputs:
sign:
type: boolean
default: true
description: Whether to check signing result
defaults:
run:
shell: bash
jobs:
check-paths:
uses: ./.github/workflows/paths-ignore.yaml
with:
paths-ignore-globs: |
.github/actions/spelling/**
docs/**
**.md
package:
needs: check-paths
if: needs.check-paths.outputs.should-run == 'true'
strategy:
matrix:
include:
- platform: mac
arch: x86_64
runs-on: macos-15-intel
- platform: mac
arch: aarch64
runs-on: macos-latest
- platform: win
runs-on: windows-latest
- platform: linux
runs-on: ubuntu-22.04
runs-on: ${{ matrix.runs-on }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
# Needed to run `git describe` to get full version info
fetch-depth: 0
- uses: ./.github/actions/yarn-install
- run: yarn build
- run: yarn package
- name: Build bats.tar.gz
if: matrix.platform == 'linux'
run: make -C bats bats.tar.gz
- name: Upload bats.tar.gz
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
if: matrix.platform == 'linux'
with:
name: bats.tar.gz
path: bats/bats.tar.gz
if-no-files-found: error
- name: Upload mac disk image
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
if: matrix.platform == 'mac'
with:
name: Rancher Desktop.${{ matrix.arch }}.dmg
path: dist/Rancher Desktop*.dmg
if-no-files-found: error
- name: Upload mac zip
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
if: matrix.platform == 'mac'
with:
name: Rancher Desktop-mac.${{ matrix.arch }}.zip
path: dist/Rancher Desktop*.zip
if-no-files-found: error
- name: Upload Windows installer
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
if: matrix.platform == 'win'
with:
name: Rancher Desktop Setup.msi
path: dist/Rancher.Desktop*.msi
if-no-files-found: error
- name: Upload Windows zip
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
if: matrix.platform == 'win'
with:
name: Rancher Desktop-win.zip
path: dist/Rancher Desktop-*-win.zip
if-no-files-found: error
- name: Upload Linux zip
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
if: matrix.platform == 'linux'
with:
name: Rancher Desktop-linux.zip
path: dist/rancher-desktop-*-linux.zip
if-no-files-found: error
- name: Trigger OBS build
if: matrix.platform == 'linux' && github.ref_type == 'branch' && ( startsWith(github.ref_name, 'main') || startsWith(github.ref_name, 'release-') )
run: |
if [[ -z $AWS_ACCESS_KEY_ID ]] || [[ -z $OBS_WEBHOOK_TOKEN ]]; then
echo "Secrets unavailable, skipping."
exit 0
fi
# in pull requests GITHUB_REF_NAME is in the form "<pr_number>/merge";
# remove slashes since they aren't valid in filenames
no_slash_ref_name="${GITHUB_REF_NAME//\//-}"
zip_name="rancher-desktop-linux-${no_slash_ref_name}.zip"
# Copy zip file to S3
aws s3 cp \
dist/rancher-desktop-*-linux.zip \
"s3://rancher-desktop-assets-for-obs/$zip_name"
# Trigger OBS services for relevant package in dev channel
curl -X POST \
-H "Authorization: Token ${OBS_WEBHOOK_TOKEN}" \
"https://build.opensuse.org/trigger/runservice?project=isv:Rancher:dev&package=rancher-desktop-${GITHUB_REF_NAME}"
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_DEFAULT_REGION: us-east-1
OBS_WEBHOOK_TOKEN: ${{ secrets.OBS_WEBHOOK_TOKEN }}
sign-win:
name: Test Signing (Windows)
needs: package
runs-on: windows-2022
if: >-
(github.event_name == 'push' && github.ref == 'refs/heads/main') ||
(github.event_name == 'push' && startsWith(github.ref, 'refs/heads/release-')) ||
(github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')) ||
(github.event_name == 'workflow_dispatch' && github.event.inputs.sign)
permissions:
contents: read
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- uses: ./.github/actions/yarn-install
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
name: Download artifact
with:
name: Rancher Desktop-win.zip
- name: Generate test signing certificate
shell: powershell
run: |
$cert = New-SelfSignedCertificate `
-Type Custom `
-Subject "CN=Rancher-Sandbox, C=CA" `
-KeyUsage DigitalSignature `
-CertStoreLocation Cert:\CurrentUser\My `
-FriendlyName "Rancher-Sandbox Code Signing" `
-TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3", "2.5.29.19={text}")
Write-Output $cert
Write-Output "CSC_FINGERPRINT=$($cert.Thumbprint)" `
| Out-File -Append -Encoding ASCII "${env:GITHUB_ENV}"
timeout-minutes: 1
- name: Sign artifact
shell: powershell
run: yarn sign (Get-Item "Rancher Desktop*-win.zip")
timeout-minutes: 10
- name: Verify installer signature
shell: powershell
run: |
$usedCert = (Get-AuthenticodeSignature -FilePath 'dist\Rancher*Desktop*.msi').SignerCertificate
Write-Output $usedCert
if ($usedCert.Thumbprint -ne $env:CSC_FINGERPRINT) {
Throw "Installer signed with wrong certificate"
}
timeout-minutes: 1
sign-mac:
name: Test Signing (macOS)
needs: package
strategy:
matrix:
include:
- arch: aarch64
# skip x86_64, we don't need to duplicate the testing for now.
runs-on: macos-latest
if: >-
(github.event_name == 'push' && github.ref == 'refs/heads/main') ||
(github.event_name == 'push' && startsWith(github.ref, 'refs/heads/release-')) ||
(github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')) ||
(github.event_name == 'workflow_dispatch' && github.event.inputs.sign)
permissions:
contents: read
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- uses: ./.github/actions/yarn-install
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
name: Download artifact
with:
name: Rancher Desktop-mac.${{ matrix.arch }}.zip
- name: Generate test signing certificate
run: |
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem \
-keyform pem -sha256 -days 3650 -nodes -subj \
"/C=CA/CN=RD Test Signing Key" \
-addext keyUsage=critical,digitalSignature \
-addext extendedKeyUsage=critical,codeSigning
# Create a custom keychain so we can unlock it properly.
security create-keychain -p "" tmp.keychain
security default-keychain -d user -s tmp.keychain
security unlock-keychain -p "" tmp.keychain
security set-keychain-settings -u tmp.keychain # Disable keychain auto-lock
security import key.pem -k tmp.keychain -t priv -A
security import cert.pem -k tmp.keychain -t cert -A
security set-key-partition-list -S apple-tool:,apple:,codesign: -s \
-k "" tmp.keychain
# Print out the valid certificates for debugging.
security find-identity
# Determine the key fingerprint.
awk_expr='/)/ { print $2 ; exit }'
hash="$(security find-identity | awk "$awk_expr")"
echo "CSC_FINGERPRINT=${hash}" >> "$GITHUB_ENV"
timeout-minutes: 1
- name: Flag build for M1
if: matrix.arch == 'aarch64'
run: echo "M1=1" >> "${GITHUB_ENV}"
- name: Sign artifact
run: |
for zip in Rancher\ Desktop-*mac*.zip; do
echo "::group::Signing ${zip}"
yarn sign --skip-notarize --skip-constraints "${zip}"
echo "::endgroup::"
done
timeout-minutes: 15
- name: Verify signature
run: |
codesign --verify --deep --strict --verbose=2 dist/*.dmg
codesign --verify --deep --strict --verbose=2 dist/*.zip
timeout-minutes: 5
================================================
FILE: .github/workflows/paths-ignore.yaml
================================================
# This is a reusable workflow to determine if the current change requires an E2E
# run. This is required because using [paths-ignored] directly means the whole
# workflow is skipped, but that means that it doesn't count as having run a
# required workflow.
# Usage:
# jobs:
# check-paths:
# uses: ./.github/workflows/actions/paths-ignore.yaml
# do_thing:
# if: jobs.check-paths.outputs.should-run == 'true'
# # Unfortunately, a string comparison is required.
name: Check for ignored paths
on:
workflow_call:
inputs:
paths-ignore-globs:
description: >
Paths to ignore. Should glob patterns (as a git pathspec glob), one
per line. See
https://git-scm.com/docs/gitglossary#Documentation/gitglossary.txt-glob
type: string
default: |
.github/actions/spelling/**
bats/**
docs/**
**.md
outputs:
should-run:
description: Whether other steps should run.
value: ${{ jobs.check.outputs.should-run }}
permissions:
contents: read
jobs:
check:
runs-on: ubuntu-latest
steps:
- name: Set baseline result
run: echo "SHOULD_RUN=true" >> "$GITHUB_ENV"
- name: Determine paths to ignore
if: github.event_name == 'pull_request'
run: |
PATHS_IGNORE="PATHS_IGNORE="
while read -r line; do
if [[ -n $line ]]; then
PATHS_IGNORE="${PATHS_IGNORE} :!/${line}"
fi
done <<< "$INPUT"
echo "$PATHS_IGNORE"
echo "$PATHS_IGNORE" >> "$GITHUB_ENV"
env:
INPUT: ${{ inputs.paths-ignore-globs }}
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
if: github.event_name == 'pull_request'
with:
fetch-depth: 0
persist-credentials: false
- name: Check for differences
if: github.event_name == 'pull_request'
run: |
MERGE_BASE=$(git merge-base $BASE $HEAD)
diff="$(git diff --name-only $MERGE_BASE $HEAD -- $PATHS_IGNORE)"
if [[ -z "$diff" ]]; then
echo "No modified files found."
echo "SHOULD_RUN=false" >> "$GITHUB_ENV"
else
printf "Modified files:\n%s\n" "$diff"
fi
env:
BASE: ${{ github.event.pull_request.base.sha }}
HEAD: ${{ github.event.pull_request.head.sha }}
- name: Set final output
id: result
run: echo "should-run=$SHOULD_RUN" >> "$GITHUB_OUTPUT"
outputs:
should-run: ${{ steps.result.outputs.should-run }}
================================================
FILE: .github/workflows/rddepman.yaml
================================================
name: Update external dependencies
on:
schedule:
- cron: '23 8 * * *'
workflow_dispatch: {}
permissions:
contents: write
pull-requests: write
jobs:
check-for-token:
outputs:
has-token: ${{ steps.calc.outputs.HAS_SECRET }}
runs-on: ubuntu-latest
steps:
- id: calc
run: echo "HAS_SECRET=${HAS_SECRET}" >> "${GITHUB_OUTPUT}"
env:
HAS_SECRET: ${{ secrets.RUN_WORKFLOW_FROM_WORKFLOW != '' }}
check-update-versions:
needs: check-for-token
if: needs.check-for-token.outputs.has-token == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- uses: ./.github/actions/yarn-install
- run: yarn rddepman
env:
GITHUB_TOKEN: ${{ secrets.RUN_WORKFLOW_FROM_WORKFLOW }}
================================================
FILE: .github/workflows/rdx-host-api-tests.yaml
================================================
# This workflow builds the Rancher Desktop Extensions Host APIs testing image
# and publishes it.
name: RDX Host APIs Testing image
on:
push:
branches: [ main ]
paths: [ 'bats/tests/extensions/testdata/**' ]
workflow_dispatch: {}
permissions:
packages: write
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0
- uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0
- uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
id: meta
with:
images: |
ghcr.io/${{ github.repository }}/rdx-host-api-test
tags: type=raw,value=latest,enable={{ is_default_branch }}
- uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # v4.0.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ github.token }}
- uses: docker/build-push-action@d08e5c354a6adb9ed34480a06d141179aa583294 # v7.0.0
with:
build-args: variant=host-apis
context: bats/tests/extensions/testdata
platforms: |
linux/amd64
linux/arm64
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
================================================
FILE: .github/workflows/release-merge-to-main.yaml
================================================
name: "Release: Merge to main"
on:
release:
types:
- created
- published
- released
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
permissions: {}
jobs:
check-for-token:
outputs:
has-token: ${{ steps.calc.outputs.HAS_SECRET }}
runs-on: ubuntu-latest
steps:
- id: calc
run: echo "HAS_SECRET=${HAS_SECRET}" >> "${GITHUB_OUTPUT}"
env:
HAS_SECRET: ${{ secrets.RUN_WORKFLOW_FROM_WORKFLOW != '' }}
create-pr:
needs: check-for-token
if: needs.check-for-token.outputs.has-token == 'true'
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: ./.github/actions/yarn-install
- run: node scripts/ts-wrapper.js scripts/release-merge-to-main.ts
env:
GITHUB_WRITE_TOKEN: ${{ github.token }}
GITHUB_PR_TOKEN: ${{ secrets.RUN_WORKFLOW_FROM_WORKFLOW }}
================================================
FILE: .github/workflows/scorecard.yml
================================================
name: Scorecard supply-chain security
on:
# For Branch-Protection check. Only the default branch is supported. See
# https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection
branch_protection_rule:
# To guarantee Maintained check is occasionally updated. See
# https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained
schedule:
- cron: '23 13 * * 4'
push:
branches:
- master
workflow_dispatch:
# Declare default permissions as read only.
permissions: read-all
jobs:
analysis:
name: Scorecard analysis
runs-on: ubuntu-latest
permissions:
# Needed to upload the results to code-scanning dashboard.
security-events: write
# Needed to publish results and get a badge (see publish_results below).
id-token: write
steps:
- name: "Checkout code"
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- name: "Run analysis"
uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3
with:
results_file: results.sarif
results_format: sarif
# (Optional) "write" PAT token. Uncomment the `repo_token` line below if:
# - you want to enable the Branch-Protection check on a *public* repository, or
# - you are installing Scorecard on a *private* repository
# To create the PAT, follow the steps in https://github.com/ossf/scorecard-action?tab=readme-ov-file#authentication-with-fine-grained-pat-optional.
# repo_token: ${{ secrets.SCORECARD_TOKEN }}
# Public repositories:
# - Publish results to OpenSSF REST API for easy access by consumers
# - Allows the repository to include the Scorecard badge.
# - See https://github.com/ossf/scorecard-action#publishing-results.
publish_results: true
# Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF
# format to the repository Actions tab.
- name: "Upload artifact"
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v3.pre.node20
with:
name: SARIF file
path: results.sarif
retention-days: 5
# Upload the results to GitHub's code scanning dashboard (optional).
# Commenting out will disable upload of results to your repo's Code Scanning dashboard
- name: "Upload to code-scanning"
uses: github/codeql-action/upload-sarif@0499de31b99561a6d14a36a5f662c2a54f91beee # v4.31.2
with:
sarif_file: results.sarif
================================================
FILE: .github/workflows/screenshot.yaml
================================================
name: Screenshots
on:
workflow_dispatch:
inputs:
mock_version:
description: Mock Version
type: string
required: true
default: '1.0.0'
jobs:
screenshot:
name: Take screenshot
concurrency:
group: "${{ github.workflow_ref }} (${{ matrix.platform }})"
cancel-in-progress: true
strategy:
fail-fast: false
matrix:
include:
- platform: mac
# Use an x86_64 platform because arm64 runners don't have nested
# virtualization available.
runs-on: macos-15-intel
- platform: win
runs-on: windows-latest
- platform: linux
runs-on: ubuntu-latest
runs-on: ${{ matrix.runs-on }}
steps:
- name: "macOS: Install GetWindowID"
if: runner.os == 'macOS'
run: |
brew update
brew install smokris/getwindowid/getwindowid
- name: "Linux: Install Tools"
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install graphicsmagick x11-utils mutter # spellcheck-ignore-line
- name: "macOS: Set startup command"
if: runner.os == 'macOS'
run: echo "EXEC_COMMAND=$EXEC_COMMAND" >> "$GITHUB_ENV"
env:
EXEC_COMMAND: exec
- name: "Linux: Set startup command"
if: runner.os == 'Linux'
run: |
# Write a wrapper script to start mutter (so we get window decorations).
echo '#!/bin/sh' > /usr/local/bin/exec-command
echo 'mutter --replace --sm-disable --x11 &>/dev/null &' >> /usr/local/bin/exec-command
echo 'exec "$@"' >> /usr/local/bin/exec-command
chmod a+x /usr/local/bin/exec-command
echo "EXEC_COMMAND=$EXEC_COMMAND /usr/local/bin/exec-command" >> "$GITHUB_ENV"
env:
EXEC_COMMAND: >-
exec xvfb-run --auto-servernum
--server-args='-screen 0 1280x960x24'
- name: "Windows: Set startup command"
if: runner.os == 'Windows'
shell: bash
run: echo "EXEC_COMMAND=$EXEC_COMMAND" >> "$GITHUB_ENV"
env:
EXEC_COMMAND: # On Windows, we don't need any commands.
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- uses: ./.github/actions/yarn-install
- uses: ./.github/actions/setup-environment
- name: Override version
if: inputs.mock_version
run: echo "RD_MOCK_VERSION=${{ inputs.mock_version }}" >> "${GITHUB_ENV}"
shell: bash
- run: ${{ env.EXEC_COMMAND }} yarn screenshots
env:
EXEC_COMMAND: ${{ env.EXEC_COMMAND }}
RD_ENV_SCREENSHOT_SLEEP: 5000
RD_LOGS_DIR: logs
- name: Upload screenshots
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: screenshots-${{ matrix.platform }}.zip
path: screenshots/output/
if-no-files-found: error
- name: Upload logs
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
if: always()
with:
name: logs-${{ matrix.platform }}.zip
path: |
logs/
e2e/reports/
screenshots/output/
package:
name: Package screenshots for docs
needs: screenshot
concurrency:
group: "${{ github.workflow_ref }} (package)"
cancel-in-progress: true
runs-on: ubuntu-latest
steps:
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
pattern: screenshots-*.zip
merge-multiple: true
path: ${{ github.workspace }}/in
- name: Rename images
run: |
while IFS= read -d $'\0' -r line; do
IFS=/ read -r in platform scheme window name <<<"$line"
if [[ "$scheme" != "light" ]]; then
continue
fi
case "$platform" in
darwin) platform=macOS;;
linux) platform=Linux;;
win32) platform=Windows;;
esac
if [[ "$window" == "main" ]]; then
window="ui-main"
fi
if [[ $name =~ ^[0-9]+_ ]]; then
name="${name#*_}"
fi
if [[ name == "intro" ]]; then
continue
fi
out="out/${window}/${platform}_${name}"
mkdir -p "$(dirname "$out")"
cp "$line" "$out"
echo "$out"
done < <(find in -name '*.png' -print0)
- name: Generate introduction image
run: |
# The intro image consists of the mac image on the left and the Windows
# image on the right, each showing Kubernetes settings.
sudo DEBIAN_FRONTEND=noninteractive apt-get install graphicsmagick # spellcheck-ignore-line
mkdir -p out/getting-started
gm convert in/darwin/light/main/*_intro.png in/win32/light/main/*_intro.png +append out/getting-started/introduction_preferences_tabKubernetes.png
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: screenshots.zip
path: out
if-no-files-found: error
overwrite: true
================================================
FILE: .github/workflows/smoke-test/install-from-repo.sh
================================================
#!/usr/bin/env bash
# This script is expected to run as root and install Rancher Desktop from the
# repository obs://isv:Rancher:dev
# Expected environment variables:
# RD_VERSION
# Rancher Desktop version; either major.minor (`1.20`) or the tag (`v1.20.0`).
set -o errexit -o nounset
# shellcheck disable=2329 # The function is invoked dynamically
install_linux_debian() {
local keyLocation=/usr/share version
if [[ -d /etc/apt/keyrings ]]; then
keyLocation=/etc/apt
fi
apt-get update
apt-get install -y gnupg
curl -s https://download.opensuse.org/repositories/isv:/Rancher:/dev/deb/Release.key \
| gpg --dearmor \
> "${keyLocation}/keyrings/isv-rancher-dev-archive-keyring.gpg"
echo "deb [signed-by=${keyLocation}/keyrings/isv-rancher-dev-archive-keyring.gpg] https://download.opensuse.org/repositories/isv:/Rancher:/dev/deb/ ./"\
> /etc/apt/sources.list.d/isv-rancher-dev.list
apt-get update
version=$(apt-cache show --quiet rancher-desktop \
| awk -F': ' "/^Version: 0\.release${RD_VERSION//./\\.}\./ { print \$2 }")
if [[ -z "${version}" ]]; then
echo "Could not find any versions of rancher-desktop" >&2
exit 1
fi
apt-get install -y "rancher-desktop=${version}"
}
# shellcheck disable=2329 # The function is invoked dynamically
install_linux_opensuse() {
zypper --non-interactive addrepo https://download.opensuse.org/repositories/isv:/Rancher:/dev/rpm/isv:Rancher:dev.repo
zypper --non-interactive --gpg-auto-import-keys install libxml2-tools
local version
version=$(zypper --xmlout --non-interactive search --details --match-exact rancher-desktop \
| xmllint --xpath "string(//solvable[@kind='package']/@edition[contains(., '0.release${RD_VERSION}.')])" -)
zypper --non-interactive install "rancher-desktop=${version}"
}
# shellcheck disable=2329 # The function is invoked dynamically
install_linux_fedora() {
dnf config-manager addrepo --from-repofile=https://download.opensuse.org/repositories/isv:/Rancher:/dev/fedora/isv:Rancher:dev.repo
local version
version=$(dnf --quiet info --showduplicates rancher-desktop.x86_64 \
| awk -F: "\$1 ~ /Version/ && \$2 ~ /0\.release${RD_VERSION//./\\.}/ { print \$2 }" \
| tr -d '[:space:]')
dnf --assumeyes install "rancher-desktop-${version}"
}
main() {
RD_VERSION=$(grep --only-matching '\([0-9]\+\.[0-9]\+\)' <<< "$RD_VERSION")
source /etc/os-release
for id in ${ID:-} ${ID_LIKE:-}; do
if [[ "$(type -t "install_linux_$id")" == function ]]; then
eval "install_linux_$id"
exit 0
fi
done
printf "Could not find supported distribution in %s\n" "${ID:-} ${ID_LIKE:-}" >&2
exit 1
}
main
================================================
FILE: .github/workflows/smoke-test/smoke-test.sh
================================================
#!/usr/bin/env bash
# This script is expected to run from CI, and does a final smoke test.
# There should be an installer in the current directory (or, in the case of
# Linux, a zip file), along with its accompanying sha512sum file.
# On Windows, build/signing-config-win.yaml is also required.
# Environment variables as inputs:
# RD_SKIP_INSTALL (Linux)
# Skip installing Rancher Desktop, and assume it was installed from the repo.
# Required tools:
# - jq
# - yq (Windows only)
# Note that, on Windows, this is run via msys bash (installed wit git).
set -o errexit -o nounset
shopt -s nullglob
export MSYS2_ARG_CONV_EXCL='*'
RDCTL= # Path to rdctl
APPIMAGE_PID= # PID of AppImage process; not used if not using AppImage.
# All commands in the cleanups array will be run on exit. They must be plain
# strings that will be passed to eval
cleanups=()
# Run the cleanups.
do_cleanup() {
# In case the array has holes (it shouldn't), make an array of indices.
local indices=("${!cleanups[@]}")
local i
for (( i=${#indices[@]} - 1; i >= 0; i-- )); do
# shellcheck disable=2086 # We expect to glob and word split
eval ${cleanups[$i]}
done
}
trap do_cleanup EXIT
# Locate the archive, check its checksum, and echo the file name.
get_archive() {
local checksum archiveName
if [[ -n "${RD_SKIP_INSTALL:-}" ]]; then
echo "Skipping getting archive." >&2
echo "no-archive-used"
return
fi
for checksum in *.sha512sum; do
archiveName=${checksum%.sha512sum}
if command -v sha512sum &>/dev/null; then
sha512sum --check --quiet --strict "$checksum"
else
shasum --check --quiet --algorithm 512 "$checksum"
fi
grep --quiet "$archiveName" "$checksum"
readlink -f "$archiveName"
return
done
echo "Failed to find archive." >&2
exit 1
}
# Return the current platform; one of "darwin", "linux", "win32"
get_platform() {
case "$(uname -s)" in
Darwin)
echo "darwin";;
Linux)
echo "linux";;
MINGW*)
echo "win32";;
*)
printf "Unsupported platform %s\n" "$(uname -s)" >&2
exit 1;;
esac
}
# Assume the first argument given is a path to the Rancher Desktop .dmg disk
# image; install it, and set the global variable RDCTL to the path of the rdctl
# executable.
install_darwin() {
local archiveName=$1
local mountpoint
mountpoint=$(mktemp -d -t rd-dmg-)
cleanups+=("rm -rf '$mountpoint'")
local srcApp="${mountpoint}/Rancher Desktop.app"
local destApp="/Applications/Rancher Desktop.app"
codesign --verify --deep --strict --verbose=2 --check-notarization "$archiveName"
hdiutil attach "$archiveName" -mountpoint "$mountpoint"
cleanups+=("hdiutil detach '$mountpoint'")
codesign --verify --deep --strict --verbose=2 --check-notarization "$srcApp"
mkdir -p "$destApp"
cleanups+=("rm -rf '$destApp'")
cp -a "$srcApp" "$(dirname "$destApp")"
xattr -d -r -s -v com.apple.quarantine "$destApp"
# Check that the image is compressed
local compressionRatio
compressionRatio="$(hdiutil imageinfo -plist "$archiveName" \
| plutil -convert json -o - - \
| jq '.["Size Information"]["Compressed Ratio"]')"
if jq --exit-status '. > 0.9' <<<"$compressionRatio"; then
printf "Archive %s appears to be uncompressed; compression ratio is %s\n" \
"$archiveName" "$compressionRatio" >&2
exit 1
fi
if [[ "$(uname -m)" =~ arm ]]; then
# For macOS, currently only x86_64 runners support nested virtualization
# https://github.com/actions/runner-images/issues/9460
# Abort the script (gracefully) instead of trying to run RD.
echo "Skipping actually running on Rancher Desktop because arm64 runners do not have nested virtualization" >&2
exit 0
fi
RDCTL="$destApp/Contents/Resources/resources/darwin/bin/rdctl"
}
# Assume the first argument given is a path to the Rancher Desktop zip file;
# install it, and set the global variable RDCTL to the path of the rdctl
# executable. If the archive is an AppImage file instead, then this function
# instead sets APPIMAGE_PID.
install_linux() {
if [[ $(id --user) -eq 0 ]]; then
echo "This script should not be run as root" >&2
exit 1
fi
if [[ -z "${RD_SKIP_INSTALL:-}" ]]; then
local archiveName=$1
if [[ "$archiveName" =~ .*\.AppImage$ ]]; then
sudo chmod a+x "$archiveName"
"$archiveName" \
--no-sandbox --enable-logging=stderr --v=1 \
--no-modal-dialogs --kubernetes.enabled \
--application.updater.enabled=false&
APPIMAGE_PID=$!
return
else
sudo mkdir -p /opt/rancher-desktop
sudo unzip -d /opt/rancher-desktop "$archiveName"
sudo chmod 4755 /opt/rancher-desktop/chrome-sandbox
fi
fi
RDCTL="/opt/rancher-desktop/resources/resources/linux/bin/rdctl"
}
# Helper function on Windows to verify the signature of a file (provided as the
# first argument).
win32_verify() {
local path
path="$(cygpath --windows "$1")"
# When running GitHub actions, using `powershell.exe` here causes issues
# with loading the `Microsoft.PowerShell.Security` module; using `pwsh.exe`
# seems to be fine. This is probably because the default shell is pwsh, and
# the environment has paths to the PowerShell 7 version of the module, so it
# tries to load that instead of the version appropriate for PowerShell.exe.
local pwsh=(pwsh.exe -NoLogo -NoProfile -NonInteractive -Command)
local stdout
stdout=$("${pwsh[@]}" "\$(Get-AuthenticodeSignature '$path').Status")
if [[ "$stdout" != "Valid" ]]; then
printf "%s is not correctly signed:\n" "$path"
"${pwsh[@]}" "Get-AuthenticodeSignature '$path' | Format-List"
exit 1
fi
}
# Assume the first argument given is a path to the Rancher Desktop installer;
# install it, and set the global variable RDCTL to the path of the rdctl
# executable.
install_win32() {
local archiveName=$1
win32_verify "$archiveName"
mkdir -p "$(cygpath --unix "${RD_LOGS_DIR}")"
msiexec.exe '/lv*x' "${RD_LOGS_DIR}\\install.log" \
/i "$(cygpath --windows "$archiveName")" /passive ALLUSERS=1
# msiexec returns immediately and runs in the background; wait for that
# process to exit before continuing.
local deadline completed
deadline=$(( $(date +%s) + 10 * 60 ))
while [[ $(date +%s) -lt $deadline ]]; do
if tasklist.exe /FI "ImageName eq msiexec.exe" | grep msiexec; then
printf "Waiting for msiexec to finish: %s/%s\n" "$(date)" "$(date --date="@$deadline")"
sleep 10
else
completed=true
break
fi
done
if [[ -z "${completed:-}" ]]; then
echo "msiexec took too long to finish, aborting" >&2
exit 1
fi
local installDirectory
installDirectory=$(cygpath --unix 'C:\Program Files\Rancher Desktop')
local rdctl="$installDirectory/resources/resources/win32/bin/rdctl.exe"
local -a keys
mapfile -t keys < <(yq.exe 'keys | .[]' < build/signing-config-win.yaml)
local key
for key in "${keys[@]}"; do
local expr='.[env(key)][] | select(. != "!*")'
local -a values
mapfile -t values < <(key=$key yq.exe "$expr" < build/signing-config-win.yaml)
for value in "${values[@]}"; do
if [[ "$value" == "wix-custom-action.dll" ]]; then
# This file is not installed
continue
fi
win32_verify "$installDirectory/$key/$value"
done
done
# Verify that rdctl exists
win32_verify "$rdctl"
RDCTL=$rdctl
}
# Wait for the backend to be alive. $RDCTL must be set (from the install_*
# functions). If $APPIMAGE_PID is set, assume we're running AppImage instead.
wait_for_backend() {
local deadline state deadline_date platform rd_pid
deadline=$(( $(date +%s) + 10 * 60 ))
deadline_date=$({ date --date="@$deadline" || date -j -f %s "$deadline"; } 2>/dev/null)
platform=$(get_platform)
while [[ $(date +%s) -lt $deadline ]]; do
if [[ -n "${APPIMAGE_PID:-}" ]] && [[ -z "${RDCTL:-}" ]]; then
rd_pid=$(pidof --separator $'\n' rancher-desktop | sort -n | head -n 1 || echo missing)
if [[ -e /proc/$rd_pid/exe ]]; then
RDCTL=$(dirname "$(readlink /proc/$rd_pid/exe)")/resources/resources/linux/bin/rdctl
continue
fi
state=NOT_RUNNING
elif [[ $platform == linux ]] && [[ ! -e $HOME/.local/share/rancher-desktop/rd-engine.json ]]; then
state=NO_SERVER_CONFIG
else
state=$("$RDCTL" api /v1/backend_state || echo '{"vmState": "NO_RESPONSE"}')
state=$(jq --raw-output .vmState <<< "$state")
fi
case "$state" in
ERROR)
echo "Backend reached error state." >&2
exit 1 ;;
STARTED|DISABLED)
return ;;
*)
printf "Backend state: %s\n" "$state";;
esac
# if we get here, either we failed to get state or it's starting.
printf "Waiting for backend: (%s) %s/%s\n" "$state" "$(date)" "$deadline_date"
sleep 10
done
echo "Timed out waiting for backend to stabilize." >&2
printf "Current time: %s\n" "$(date)" >&2
printf "Deadline: %s\n" "$deadline_date" >&2
exit 1
}
main() {
local archive platform
platform=$(get_platform)
archive=$(get_archive)
eval "install_${platform}" "$archive"
if [[ -z "${APPIMAGE_PID:-}" ]]; then
"$RDCTL" start --no-modal-dialogs \
--kubernetes.enabled --application.updater.enabled=false
cleanups+=("'$RDCTL' shutdown")
fi
wait_for_backend
echo "Smoke test passed."
}
main
================================================
FILE: .github/workflows/smoke-test.yaml
================================================
# This workflow downloads artifacts from a (by default, draft) release and runs
# a short smoke test where the application is installed and run and immediately
# shut down.
# Since we need contents-write permissions to look at draft releases, we
# actually download the artifacts in a smaller job, then upload them into the
# run and download it _again_ in the second (per-platform) job where no
# permissions are required.
name: Release smoke test
permissions: {}
on:
workflow_dispatch:
inputs:
tag:
description: >
Download artifacts from release with this tag, rather than picking the
first draft release.
type: string
jobs:
download-artifacts:
name: Find release
runs-on: ubuntu-latest
permissions:
contents: write # Needed to list draft releases
env:
RELEASE_TAG: ${{ inputs.tag }}
outputs:
release-tag: ${{ steps.set-release-tag.outputs.release-tag }}
steps:
- name: Find release
if: inputs.tag == ''
run: >-
set -o xtrace;
printf "RELEASE_TAG=%s\n" >>"$GITHUB_ENV"
"$(gh api repos/${{ github.repository }}/releases
--jq 'map(select(.draft))[0].tag_name')"
env:
GH_TOKEN: ${{ github.token }}
- id: set-release-tag
run: >-
printf "release-tag=%s\n" "$RELEASE_TAG" >> "$GITHUB_OUTPUT"
- name: Download artifacts
run: |
if [[ -z "$RELEASE_TAG" ]]; then
echo "Failed to find release tag" >&2
exit 1
fi
gh release download "$RELEASE_TAG" \
--repo ${{ github.repository }} \
--pattern '*.dmg' \
--pattern '*.dmg.sha512sum' \
--pattern '*.msi' \
--pattern '*.msi.sha512sum' \
--pattern 'rancher-desktop-linux-*.zip' \
--pattern 'rancher-desktop-linux-*.zip.sha512sum'
env:
GH_TOKEN: ${{ github.token }}
- name: Download AppImage
run: |
branch=$(cut -d. -f1,2 <<< "${RELEASE_TAG#v}")
read -r artifact_name < <(
curl "${OBS_DOWNLOAD_URL}?jsontable" \
| jq --raw-output ".data[].name | select(endswith(\".AppImage\")) | select(contains(\".release${branch}.\"))"
)
curl -L -o rancher-desktop.AppImage "${OBS_DOWNLOAD_URL}${artifact_name}"
# The AppImage does not have a checksum; make one up.
sha512sum rancher-desktop.AppImage > rancher-desktop.AppImage.sha512sum
chmod a+x rancher-desktop.AppImage
env:
OBS_DOWNLOAD_URL: https://download.opensuse.org/download/repositories/isv:/Rancher:/dev/AppImage/
- name: Upload macOS aarch-64 artifacts
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: application-macos-aarch64.zip
if-no-files-found: error
path: |
*.aarch64.dmg
*.aarch64.dmg.sha512sum
- name: Upload macOS x86_64 artifacts
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: application-macos-x86_64.zip
if-no-files-found: error
path: |
*.x86_64.dmg
*.x86_64.dmg.sha512sum
- name: Upload Windows artifacts
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: application-win32.zip
if-no-files-found: error
path: |
*.msi
*.msi.sha512sum
- name: Upload Linux artifacts
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: application-linux.zip
if-no-files-found: error
path: |
rancher-desktop-linux-*.zip
rancher-desktop-linux-*.zip.sha512sum
- name: Upload Linux AppImage
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: application-linux.AppImage
if-no-files-found: error
path: |
rancher-desktop.AppImage
rancher-desktop.AppImage.sha512sum
smoke-test:
name: Smoke test
needs: download-artifacts
strategy:
fail-fast: false
matrix:
include:
- { platform: macos-aarch64, runs-on: macos-14 }
- { platform: macos-x86_64, runs-on: macos-15-intel }
- { platform: win32, runs-on: windows-latest }
- { platform: linux, runs-on: ubuntu-latest }
runs-on: ${{ matrix.runs-on }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- name: Set up environment
uses: ./.github/actions/setup-environment
- name: "Linux: Set startup command"
if: runner.os == 'Linux'
run: echo "EXEC_COMMAND=$EXEC_COMMAND" >> "$GITHUB_ENV"
env:
EXEC_COMMAND: >-
exec xvfb-run --auto-servernum
--server-args='-screen 0 1280x960x24'
- name: Set log directory
shell: bash
# Use node here to do path manipulation to get correct Windows paths.
run: >-
node --eval='console.log("RD_LOGS_DIR=" + require("path").join(process.cwd(), "logs"));'
>> "$GITHUB_ENV"
- name: Download artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: application-${{ matrix.platform }}.zip
- run: ${{ env.EXEC_COMMAND }} .github/workflows/smoke-test/smoke-test.sh
shell: bash
- name: Upload logs
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
if: always()
with:
name: logs-${{ matrix.platform }}.zip
path: ${{ github.workspace }}/logs
if-no-files-found: warn
repository-smoke-test:
name: Smoke test repository
needs: download-artifacts
strategy:
fail-fast: false
matrix:
include:
- { id: opensuse-tumbleweed, image: "registry.opensuse.org/opensuse/tumbleweed:latest"}
- { id: opensuse-leap, image: "registry.opensuse.org/opensuse/leap:latest" }
- { id: debian, image: "debian:latest" }
- { id: fedora, image: "fedora:latest" }
runs-on: ubuntu-latest
container:
image: ${{ matrix.image }}
options: --privileged
steps:
- name: Install basic tools
if: contains(matrix.id, 'opensuse')
run: >-
zypper --non-interactive install
git-core tar
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- name: Set up user
run: |
useradd --create-home --user-group ci-user
export LOGS_DIR=$PWD/logs
export RD_LOGS_DIR=$LOGS_DIR/rd
echo "LOGS_DIR=$LOGS_DIR" >> "$GITHUB_ENV"
echo "RD_LOGS_DIR=$RD_LOGS_DIR" >> "$GITHUB_ENV"
mkdir -p $RD_LOGS_DIR
chown --recursive ci-user "$LOGS_DIR"
- uses: ./.github/actions/setup-environment
- name: Install Rancher Desktop from package
if: runner.os == 'Linux'
run: .github/workflows/smoke-test/install-from-repo.sh
env:
RD_VERSION: ${{ needs.download-artifacts.outputs.release-tag }}
- name: "openSUSE Workaround for #9145"
if: contains(matrix.id, 'opensuse')
run: >-
zypper --non-interactive install
qemu-img qemu-hw-display-virtio-gpu
- name: Run smoke test
shell: bash
run: |
inner_command=(
xvfb-run
--auto-servernum
--server-args='-screen 0 1280x960x24'
$PWD/.github/workflows/smoke-test/smoke-test.sh
)
sudo --user=ci-user --login --set-home --non-interactive \
/usr/bin/env --chdir=$PWD \
RD_DEBUG_ENABLED=1 RD_TEST=smoke RD_SKIP_INSTALL=true RD_LOGS_DIR=$RD_LOGS_DIR \
script \
--log-out $LOGS_DIR/repo-${{ matrix.id }}.log \
--return --command "${inner_command[*]@Q}"
- name: Take screenshot
if: failure()
continue-on-error: true
shell: >-
sudo --user=ci-user --login --set-home --non-interactive
bash --noprofile --norc -eo pipefail {0}
run: |
set -o xtrace -o errexit
PID=$(pidof smoke-test.sh || echo missing)
if [[ ! -r /proc/$PID/environ ]]; then
echo "Rancher Desktop is not running" >&2
exit 0
fi
export $(gawk 'BEGIN { RS="\0"; FS="=" } ($1 == "DISPLAY" || $1 == "XAUTHORITY") { print }' \
< /proc/$PID/environ)
env
export MAGICK_DEBUG=All # spellcheck-ignore-line
gm import -window root -verbose $LOGS_DIR/screenshot-${{ matrix.id }}.png
- name: Upload logs
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
if: always()
with:
name: logs-repo-${{ matrix.id }}.zip
path: ${{ github.workspace }}/logs
if-no-files-found: warn
appimage-smoke-test:
name: Smoke test AppImage
needs: download-artifacts
strategy:
fail-fast: false
matrix:
include:
- { id: opensuse, image: "registry.opensuse.org/opensuse/tumbleweed:latest" }
- { id: rocky, image: "rockylinux/rockylinux:9" }
runs-on: ubuntu-latest
container:
image: ${{ matrix.image }}
options: --privileged
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- name: Set up user
run: |
useradd --create-home --user-group ci-user
export LOGS_DIR=$PWD/logs
export RD_LOGS_DIR=$LOGS_DIR/rd
echo "LOGS_DIR=$LOGS_DIR" >> "$GITHUB_ENV"
echo "RD_LOGS_DIR=$RD_LOGS_DIR" >> "$GITHUB_ENV"
mkdir -p $RD_LOGS_DIR
chown --recursive ci-user "$LOGS_DIR"
- uses: ./.github/actions/setup-environment
with:
user: ci-user
- name: Download AppImage
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: application-linux.AppImage
- name: Run smoke test
run: |
inner_command=(
xvfb-run
--auto-servernum
--server-args='-screen 0 1280x960x24'
$PWD/.github/workflows/smoke-test/smoke-test.sh
)
sudo --user=ci-user --login --set-home --non-interactive \
/usr/bin/env --chdir=$PWD \
RD_DEBUG_ENABLED=1 RD_TEST=smoke RD_LOGS_DIR=$RD_LOGS_DIR \
script \
--log-out $LOGS_DIR/appimage-${{ matrix.id }}.log \
--return --command "${inner_command[*]@Q}" \
- name: Take screenshot
if: failure()
continue-on-error: true
shell: >-
sudo --user=ci-user --login --set-home --non-interactive
bash --noprofile --norc -eo pipefail {0}
run: |
set -o xtrace -o errexit
PID=$(pidof rancher-desktop.AppImage || echo missing)
if [[ ! -r /proc/$PID/environ ]]; then
echo "Rancher Desktop is not running" >&2
exit 0
fi
export $(gawk 'BEGIN { RS="\0"; FS="=" } ($1 == "DISPLAY" || $1 == "XAUTHORITY") { print }' \
< /proc/$PID/environ)
env
export MAGICK_DEBUG=All # spellcheck-ignore-line
gm import -window root -verbose $LOGS_DIR/screenshot-${{ matrix.id }}.png
- name: Upload logs
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
if: always()
with:
name: logs-appimage-${{ matrix.id }}.zip
path: ${{ github.workspace }}/logs
if-no-files-found: warn
================================================
FILE: .github/workflows/spelling.yml
================================================
name: Check Spelling
# Comment management is handled through a secondary job, for details see:
# https://github.com/check-spelling/check-spelling/wiki/Feature%3A-Restricted-Permissions
#
# `jobs.comment-push` runs when a push is made to a repository and the `jobs.spelling` job needs to make a comment
# (in odd cases, it might actually run just to collapse a comment, but that's fairly rare)
# it needs `contents: write` in order to add a comment.
#
# `jobs.comment-pr` runs when a pull_request is made to a repository and the `jobs.spelling` job needs to make a comment
# or collapse a comment (in the case where it had previously made a comment and now no longer needs to show a comment)
# it needs `pull-requests: write` in order to manipulate those comments.
# Updating pull request branches is managed via comment handling.
# For details, see: https://github.com/check-spelling/check-spelling/wiki/Feature:-Update-expect-list
#
# These elements work together to make it happen:
#
# `on.issue_comment`
# This event listens to comments by users asking to update the metadata.
#
# `jobs.update`
# This job runs in response to an issue_comment and will push a new commit
# to update the spelling metadata.
#
# `with.experimental_apply_changes_via_bot`
# Tells the action to support and generate messages that enable it
# to make a commit to update the spelling metadata.
#
# `with.ssh_key`
# In order to trigger workflows when the commit is made, you can provide a
# secret (typically, a write-enabled github deploy key).
#
# For background, see: https://github.com/check-spelling/check-spelling/wiki/Feature:-Update-with-deploy-key
# SARIF reporting
#
# Access to SARIF reports is generally restricted (by GitHub) to members of the repository.
#
# Requires enabling `security-events: write`
# and configuring the action with `use_sarif: 1`
#
# For information on the feature, see: https://github.com/check-spelling/check-spelling/wiki/Feature:-SARIF-output
# Minimal workflow structure:
#
# on:
# push:
# ...
# jobs:
# # you only want the spelling job, all others should be omitted
# spelling:
# # remove `security-events: write` and `use_sarif: 1`
# # remove `experimental_apply_changes_via_bot: 1`
# ... otherwise, adjust the `with:` as you wish
# on.pull_request(_target).edited is only needed for with.check_commit_messages: title | description
on:
push:
branches:
- "**"
tags-ignore:
- "**"
pull_request:
branches:
- "**"
types:
- 'opened'
- 'reopened'
- 'synchronize'
permissions: {}
jobs:
spelling:
name: Check Spelling
permissions:
contents: read
pull-requests: read
actions: read
security-events: write # To be able to write SARIF events
runs-on: ubuntu-latest
if: ${{ contains(github.event_name, 'pull_request') || github.event_name == 'push' }}
concurrency:
group: spelling-${{ github.event.pull_request.number || github.ref }}
# note: If you use only_check_changed_files, you do not want cancel-in-progress
cancel-in-progress: true
env:
UPLOAD_SARIF_LIMITED: '' # Set by `yarn lint:spelling`.
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
# We don't actually need the full `yarn install`; we just do enough to set
# up `yarn` to get `yarn lint:spelling` to work.
- name: Drop all dependencies
run: |
yq --inplace '.dependencies = {} | .devDependencies = {}' package.json
rm -f yarn.lock
- uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version-file: package.json
- run: corepack enable yarn
- run: yarn install --no-immutable --mode=skip-build
- run: sudo apt-get install cpanminus
- name: Check Spelling
run: yarn lint:spelling
env:
GITHUB_TOKEN: ${{ github.token }} # Needed to generate SARIF reports.
RD_LINT_SPELLING: 1
- name: Upload SARIF report
# Use the limited report since if we have more than 25k errors nobody is
# going read through it all anyway.
if: always() && env.UPLOAD_SARIF_LIMITED != ''
continue-on-error: true
uses: github/codeql-action/upload-sarif@v4
with:
category: check-spelling
sarif_file: ${{ env.UPLOAD_SARIF_LIMITED }}
================================================
FILE: .github/workflows/test.yaml
================================================
name: Test
on:
push: {}
pull_request: {}
permissions: {}
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- uses: ./.github/actions/yarn-install
- run: yarn build
- run: yarn lint:nofix
- name: Install shfmt
run: go install mvdan.cc/sh/v3/cmd/shfmt@latest
- run: make -C bats lint
- run: yarn test
lint:
strategy:
matrix:
# We run the Linux lint in the `test` flow, no need to repeat it.
runs-on: [windows-latest, macos-latest]
runs-on: ${{ matrix.runs-on }}
steps:
- if: runner.os == 'Windows'
name: Configure git to use Unix line endings
run: |
git config --global core.autocrlf false
git config --global core.eol lf
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- uses: ./.github/actions/yarn-install
- run: yarn license-check
- run: ./scripts/go-license-check.sh
shell: bash
- run: yarn lint:nofix
================================================
FILE: .github/workflows/ucmonitor.yaml
================================================
name: Check for unreleased changes
on:
schedule:
- cron: '48 8 * * *'
workflow_dispatch: {}
permissions:
issues: write
jobs:
check-for-token:
outputs:
has-token: ${{ steps.calc.outputs.HAS_SECRET }}
runs-on: ubuntu-latest
steps:
- id: calc
run: echo "HAS_SECRET=${HAS_SECRET}" >> "${GITHUB_OUTPUT}"
env:
HAS_SECRET: ${{ secrets.RUN_WORKFLOW_FROM_WORKFLOW != '' }}
check-unreleased-changes:
needs: check-for-token
if: needs.check-for-token.outputs.has-token == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- uses: ./.github/actions/yarn-install
- run: yarn ucmonitor
env:
GITHUB_TOKEN: ${{ secrets.RUN_WORKFLOW_FROM_WORKFLOW }}
================================================
FILE: .github/workflows/upgrade-generate.yaml
================================================
name: Generate Upgrade Test Data
on:
workflow_dispatch: {}
permissions:
contents: read
jobs:
build:
strategy:
matrix:
include:
- platform: mac
arch: x86_64
runs-on: macos-15-intel
- platform: mac
arch: aarch64
runs-on: macos-latest
- platform: win
runs-on: windows-latest
runs-on: ${{ matrix.runs-on }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
# Needed to run `git describe` to get full version info
fetch-depth: 0
- uses: ./.github/actions/yarn-install
- run: yarn build
- run: yarn package
- name: Upload Windows installer
if: runner.os == 'Windows'
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: Rancher Desktop Setup.msi
path: dist/Rancher.Desktop*.msi
if-no-files-found: error
- if: runner.os == 'Windows'
run: cat dist/electron-builder.yaml
- name: Upload Windows build information
if: runner.os == 'Windows'
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: build-info.yml
path: dist/electron-builder.yaml
if-no-files-found: error
- name: Upload macOS archive
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
if: matrix.platform == 'mac'
with:
name: Rancher Desktop-mac.${{ matrix.arch }}.zip
path: dist/Rancher Desktop*.zip
if-no-files-found: error
release:
runs-on: ubuntu-latest
needs: build
permissions:
contents: write
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- uses: ./.github/actions/yarn-install
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
ref: gh-pages
path: pages
persist-credentials: true
- name: Download installer (msi)
id: msi
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: Rancher Desktop Setup.msi
path: RD_SETUP_MSI
- name: Download mac x86_64 archive
id: mac_x86_64
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: Rancher Desktop-mac.x86_64.zip
path: MACX86_ZIP
- name: Download mac aarch64 archive
id: mac_aarch64
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: Rancher Desktop-mac.aarch64.zip
path: MACARM_ZIP
- name: Download build information
id: info
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: build-info.yml
path: RD_BUILD_INFO
- run: node scripts/ts-wrapper.js scripts/populate-update-server.ts
env:
RD_SETUP_MSI: ${{ steps.msi.outputs.download-path }}
RD_MACX86_ZIP: ${{ steps.mac_x86_64.outputs.download-path }}
RD_MACARM_ZIP: ${{ steps.mac_aarch64.outputs.download-path }}
RD_BUILD_INFO: ${{ steps.info.outputs.download-path }}
RD_OUTPUT_DIR: ${{ github.workspace }}/pages
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_ACTOR: ${{ github.actor }}
================================================
FILE: .github/workflows/windows-e2e.yaml
================================================
name: e2e tests on Windows
on:
workflow_dispatch:
push:
branches-ignore:
- 'dependabot/**'
pull_request: {}
defaults:
run:
shell: powershell
jobs:
check-paths:
uses: ./.github/workflows/paths-ignore.yaml
e2e-tests:
needs: check-paths
if: needs.check-paths.outputs.should-run == 'true'
timeout-minutes: 90
runs-on: windows-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- uses: ./.github/actions/setup-environment
- uses: ./.github/actions/yarn-install
- name: Run e2e Tests
run: yarn test:e2e
env:
RD_DEBUG_ENABLED: '1'
- name: Upload failure reports
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
if: always()
with:
name: e2etest-artifacts
path: ./e2e/reports/*
================================================
FILE: .github/workflows/yarn-dedupe.yaml
================================================
name: Deduplicate yarn.lock
on:
schedule:
- cron: '0 9 1 * *'
workflow_dispatch: {}
permissions:
contents: write
pull-requests: write
jobs:
check-for-token:
outputs:
has-token: ${{ steps.calc.outputs.HAS_SECRET }}
runs-on: ubuntu-latest
steps:
- id: calc
run: echo "HAS_SECRET=${HAS_SECRET}" >> "${GITHUB_OUTPUT}"
env:
HAS_SECRET: ${{ secrets.RUN_WORKFLOW_FROM_WORKFLOW != '' }}
yarn-dedupe:
needs: check-for-token
if: needs.check-for-token.outputs.has-token == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- uses: ./.github/actions/yarn-install
- run: ./scripts/yarn-dedupe.sh --push
env:
GITHUB_TOKEN: ${{ secrets.RUN_WORKFLOW_FROM_WORKFLOW }}
================================================
FILE: .gitignore
================================================
*.exe
/bats/bats.tar.gz
/bats/bin/
/bats/logs/
/coverage/
/dist/
/e2e/reports/
/go.work.sum
/node_modules/
/resources/cert-manager*
/resources/darwin/
/resources/host/
/resources/linux/*
!/resources/linux/rancher-desktop.desktop
/resources/preload.js*
/resources/rancher-dashboard/
/resources/rdx-proxy.tar
/resources/spin-operator*
/resources/win32/
/screenshots/output/
/src/go/rdctl/pkg/options/generated/*.go
/e2e/e2e/test-results/.last-run.json
/.yarn/
================================================
FILE: .gitmodules
================================================
[submodule "bats/bats-core"]
path = bats/bats-core
url = https://github.com/rancher-sandbox/bats-core.git
branch = master
[submodule "bats/bats-assert"]
path = bats/bats-assert
url = https://github.com/rancher-sandbox/bats-assert.git
branch = master
[submodule "bats/bats-support"]
path = bats/bats-support
url = https://github.com/rancher-sandbox/bats-support.git
branch = master
[submodule "bats/bats-file"]
path = bats/bats-file
url = https://github.com/rancher-sandbox/bats-file.git
branch = master
================================================
FILE: .golangci.yaml
================================================
version: "2"
linters:
enable:
- bodyclose
- copyloopvar
- dogsled
- dupl
- errcheck
- goconst
- gocritic
- goprintffuncname
- gosec
- govet
- ineffassign
- misspell
- mnd
- nakedret
- noctx
- nolintlint
- staticcheck
- unconvert
- unparam
- unused
- whitespace
settings:
dupl:
threshold: 100
goconst:
min-len: 2
min-occurrences: 3
gocritic:
disabled-checks:
- dupImport # https://github.com/go-critic/go-critic/issues/845
- ifElseChain
- unnamedResult
enabled-tags:
- diagnostic
- experimental
- opinionated
- performance
- style
gosec:
excludes:
# Taint analysis rules (G7xx) produce only false positives in this codebase
- G702 # command injection via taint analysis - stub binaries forwarding args
- G703 # path traversal via taint analysis - os.CreateTemp paths
- G704 # SSRF via taint analysis - hardcoded URLs
- G705 # XSS via taint analysis - stdout writes
- G706 # log injection via taint analysis - internal log calls
# G115 flags every int↔uintptr cast on file descriptors (os.NewFile,
# syscall.Shutdown, IoctlFileClone). File descriptors are always
# non-negative and these casts are idiomatic Go.
- G115 # integer overflow conversion
# G117 matches exported struct fields named "Password" etc. The
# ConnectionInfo.Password field in rdctl/pkg/config is intentional.
- G117 # exported field matches secret pattern
config:
G306: "0644"
mnd:
# don't include the "operation" and "assign"
checks:
- argument
- case
- condition
- return
ignored-numbers:
- "0"
- "1"
-
gitextract_qqauqqo8/ ├── .editorconfig ├── .gitattributes ├── .github/ │ ├── .yamlfmt │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yml │ │ ├── config.yml │ │ └── feature_request.yml │ ├── actions/ │ │ ├── get-token/ │ │ │ └── action.yaml │ │ ├── setup-environment/ │ │ │ └── action.yaml │ │ ├── spelling/ │ │ │ ├── README.md │ │ │ ├── advice.md │ │ │ ├── allow.txt │ │ │ ├── candidate.patterns │ │ │ ├── excludes.txt │ │ │ ├── expect.txt │ │ │ ├── line_forbidden.patterns │ │ │ ├── patterns.txt │ │ │ └── reject.txt │ │ └── yarn-install/ │ │ └── action.yaml │ ├── dependabot.yml │ └── workflows/ │ ├── bats/ │ │ ├── get-tests.py │ │ ├── sanitize-artifact-name.sh │ │ └── summarize.mjs │ ├── bats.yaml │ ├── codeql.yaml │ ├── docker-cli-monitor.yaml │ ├── k3s-versions.yaml │ ├── linux-e2e.yaml │ ├── linux-release.yaml │ ├── macM1-e2e.yaml │ ├── package.yaml │ ├── paths-ignore.yaml │ ├── rddepman.yaml │ ├── rdx-host-api-tests.yaml │ ├── release-merge-to-main.yaml │ ├── scorecard.yml │ ├── screenshot.yaml │ ├── smoke-test/ │ │ ├── install-from-repo.sh │ │ └── smoke-test.sh │ ├── smoke-test.yaml │ ├── spelling.yml │ ├── test.yaml │ ├── ucmonitor.yaml │ ├── upgrade-generate.yaml │ ├── windows-e2e.yaml │ └── yarn-dedupe.yaml ├── .gitignore ├── .gitmodules ├── .golangci.yaml ├── .yarnrc.yml ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── babel.config.cjs ├── background.ts ├── bats/ │ ├── Makefile │ ├── README.md │ ├── scripts/ │ │ ├── bats-lint.pl │ │ └── ghcr-mirror.sh │ └── tests/ │ ├── compose/ │ │ ├── compose.bats │ │ └── testdata/ │ │ ├── Dockerfile.nginx │ │ ├── app/ │ │ │ ├── Dockerfile │ │ │ ├── app.py │ │ │ └── requirements.txt │ │ ├── compose.yaml │ │ └── nginx.conf │ ├── containers/ │ │ ├── allowed-images.bats │ │ ├── auto-start.bats │ │ ├── catch-duplicate-api-patterns.bats │ │ ├── docker-buildx-python3-uname.bats │ │ ├── factory-reset-containerd-shims.bats │ │ ├── factory-reset-snapshots.bats │ │ ├── factory-reset.bats │ │ ├── host-connectivity.bats │ │ ├── host-network-ports.bats │ │ ├── init.bats │ │ ├── platform.bats │ │ ├── published-ports.bats │ │ ├── published-udp-ports.bats │ │ ├── reset.bats │ │ ├── run-rancher.bats │ │ ├── split-dns-vpn.bats │ │ ├── switch-engines.bats │ │ ├── volumes.bats │ │ └── wasm.bats │ ├── extensions/ │ │ ├── allow-list.bats │ │ ├── containers.bats │ │ ├── install.bats │ │ └── testdata/ │ │ ├── Dockerfile │ │ ├── Makefile │ │ ├── README.md │ │ ├── basic.json │ │ ├── bin/ │ │ │ ├── dummy.go │ │ │ ├── dummy.sh │ │ │ └── server.go │ │ ├── compose.yaml │ │ ├── everything.json │ │ ├── host-apis.json │ │ ├── host-binaries.json │ │ ├── missing-icon-file.json │ │ ├── missing-icon.json │ │ ├── ui/ │ │ │ ├── host-apis.html │ │ │ └── index.html │ │ ├── ui.json │ │ ├── vm-compose.json │ │ └── vm-image.json │ ├── helpers/ │ │ ├── commands.bash │ │ ├── defaults.bash │ │ ├── images.bash │ │ ├── info.bash │ │ ├── kubernetes.bash │ │ ├── kubernetes.bats │ │ ├── load.bash │ │ ├── os.bash │ │ ├── paths.bash │ │ ├── profile.bash │ │ ├── snapshots.bash │ │ ├── utils.bash │ │ ├── utils.bats │ │ └── vm.bash │ ├── k8s/ │ │ ├── enable-disable-k8s.bats │ │ ├── foreach-k3s-version.bats │ │ ├── helm-install-rancher.bats │ │ ├── port-forwarding.bats │ │ ├── specify-invalid-k8s-version.bats │ │ ├── spinkube-npm.bats │ │ ├── spinkube.bats │ │ ├── traefik.bats │ │ ├── up-downgrade-k8s.bats │ │ └── wasm.bats │ ├── preferences/ │ │ ├── move-from-roaming-to-local.bats │ │ ├── surface-invalid-args.bats │ │ ├── verify-paths.bats │ │ └── verify-settings.bats │ ├── profile/ │ │ ├── create-profile-output.bats │ │ ├── deployment.bats │ │ ├── invalid-locked-k8s-version.bats │ │ └── wasm.bats │ ├── registry/ │ │ └── creds.bats │ ├── snapshots/ │ │ ├── create-use-snapshot.bats │ │ ├── restore-snapshot-after-factory-reset.bats │ │ ├── test-snapshot-list.bats │ │ └── test_rdctl_snapshot.bats │ └── utils/ │ ├── rdctl.bats │ └── spin.bats ├── build/ │ ├── electron-publisher-custom.js │ ├── license.rtf │ ├── signing-config-mac.yaml │ ├── signing-config-win.yaml │ └── wix/ │ ├── dialogs.wxs │ ├── main.wxs │ ├── scope.wxs │ ├── string-overrides.wxl │ ├── verify.wxs │ └── welcome.wxs ├── dev-app-update.yml ├── docs/ │ ├── development/ │ │ ├── README.md │ │ ├── env.md │ │ ├── factory-reset.md │ │ ├── features.md │ │ ├── linux-release-process.md │ │ ├── obs.md │ │ ├── release-checklist.md │ │ └── signing.md │ └── networking/ │ └── windows/ │ ├── README.md │ ├── rancher-desktop-guest-agent.md │ └── rancher-desktop-networking.md ├── e2e/ │ ├── assets/ │ │ └── k8s-deploy-sample/ │ │ └── nginx-sample-app.yaml │ ├── backend.e2e.spec.ts │ ├── config/ │ │ └── playwright-config.ts │ ├── containers.e2e.spec.ts │ ├── credentials-server.e2e.spec.ts │ ├── extensions.e2e.spec.ts │ ├── lockedFields.e2e.spec.ts │ ├── main.e2e.spec.ts │ ├── pages/ │ │ ├── container-logs-page.ts │ │ ├── container-shell-page.ts │ │ ├── containers-page.ts │ │ ├── diagnostics-page.ts │ │ ├── extensions-page.ts │ │ ├── images-page.ts │ │ ├── k8s-page.ts │ │ ├── nav-page.ts │ │ ├── portforward-page.ts │ │ ├── preferences/ │ │ │ ├── application.ts │ │ │ ├── containerEngine.ts │ │ │ ├── index.ts │ │ │ ├── kubernetes.ts │ │ │ ├── virtualMachine.ts │ │ │ └── wsl.ts │ │ ├── snapshots-page.ts │ │ ├── troubleshooting-page.ts │ │ ├── volumes-page.ts │ │ └── wsl-integrations-page.ts │ ├── preferences.e2e.spec.ts │ ├── quit-on-close.e2e.spec.ts │ ├── rdctl.e2e.spec.ts │ ├── start-in-background.e2e.spec.ts │ ├── startup-profiles.e2e.spec.ts │ ├── utils/ │ │ ├── ProfileUtils.ts │ │ └── TestUtils.ts │ ├── volumes.e2e.spec.ts │ └── wsl-integrations.e2e.spec.ts ├── eslint.config.mts ├── go.work ├── jest.config.js ├── package.json ├── packaging/ │ ├── electron-builder.yml │ └── linux/ │ ├── appimage.yml │ ├── flatpak.yaml │ ├── rancher-desktop.appdata.xml │ └── rancher-desktop.spec ├── pkg/ │ └── rancher-desktop/ │ ├── assets/ │ │ ├── dependencies.yaml │ │ ├── extension-data.yaml │ │ ├── lima-config.yaml │ │ ├── networks-config.yaml │ │ ├── scripts/ │ │ │ ├── 10-flannel.conflist │ │ │ ├── buildkit.confd │ │ │ ├── buildkit.initd │ │ │ ├── cert-manager.yaml │ │ │ ├── configure-allowed-images │ │ │ ├── docker-credential-rancher-desktop │ │ │ ├── install-containerd-shims │ │ │ ├── install-k3s │ │ │ ├── install-wsl-helpers │ │ │ ├── k3s-containerd-config.toml │ │ │ ├── logrotate-k3s │ │ │ ├── logrotate-lima-guestagent │ │ │ ├── logrotate-openresty │ │ │ ├── moproxy.initd │ │ │ ├── nerdctl │ │ │ ├── nginx.conf │ │ │ ├── rancher-desktop-guestagent.initd │ │ │ ├── service-cri-dockerd.initd │ │ │ ├── service-k3s.initd │ │ │ ├── service-wsl-dockerd.initd │ │ │ ├── spin-operator.yaml │ │ │ ├── wsl-data.conf │ │ │ ├── wsl-exec │ │ │ └── wsl-init │ │ ├── specs/ │ │ │ ├── README.md │ │ │ └── command-api.yaml │ │ ├── styles/ │ │ │ ├── app.scss │ │ │ ├── base/ │ │ │ │ ├── _basic.scss │ │ │ │ ├── _color.scss │ │ │ │ ├── _functions.scss │ │ │ │ ├── _helpers.scss │ │ │ │ ├── _mixins.scss │ │ │ │ ├── _typography.scss │ │ │ │ └── _variables.scss │ │ │ ├── fonts/ │ │ │ │ ├── _dots.scss │ │ │ │ ├── _fontstack.scss │ │ │ │ ├── _icons.scss │ │ │ │ └── _zerowidthspace.scss │ │ │ ├── global/ │ │ │ │ ├── _button.scss │ │ │ │ ├── _cards.scss │ │ │ │ ├── _columns.scss │ │ │ │ ├── _form.scss │ │ │ │ ├── _gauges.scss │ │ │ │ ├── _labeled-input.scss │ │ │ │ ├── _resource.scss │ │ │ │ ├── _select.scss │ │ │ │ ├── _table.scss │ │ │ │ └── _tooltip.scss │ │ │ ├── rancher-desktop.scss │ │ │ ├── themes/ │ │ │ │ ├── _dark.scss │ │ │ │ ├── _light.scss │ │ │ │ └── _suse.scss │ │ │ └── vendor/ │ │ │ ├── normalize.scss │ │ │ └── vue-select.scss │ │ └── translations/ │ │ ├── en-us.yaml │ │ └── zh-hans.yaml │ ├── backend/ │ │ ├── __tests__/ │ │ │ ├── backendHelper.spec.ts │ │ │ └── k3sHelper.spec.ts │ │ ├── backend.ts │ │ ├── backendHelper.ts │ │ ├── containerClient/ │ │ │ ├── __tests__/ │ │ │ │ ├── auth.spec.ts │ │ │ │ ├── client.spec.ts │ │ │ │ └── registry.spec.ts │ │ │ ├── auth.ts │ │ │ ├── index.ts │ │ │ ├── mobyClient.ts │ │ │ ├── nerdctlClient.ts │ │ │ ├── registry.ts │ │ │ └── types.ts │ │ ├── factory.ts │ │ ├── images/ │ │ │ ├── imageFactory.ts │ │ │ ├── imageProcessor.ts │ │ │ ├── mobyImageProcessor.ts │ │ │ └── nerdctlImageProcessor.ts │ │ ├── k3sHelper.ts │ │ ├── k8s.ts │ │ ├── kube/ │ │ │ ├── client.ts │ │ │ ├── lima.ts │ │ │ └── wsl.ts │ │ ├── kubeconfig.ts │ │ ├── lima.ts │ │ ├── mock.ts │ │ ├── mock_screenshots.ts │ │ ├── progressTracker.ts │ │ ├── steve.ts │ │ └── wsl.ts │ ├── components/ │ │ ├── ActionDropdown.vue │ │ ├── ActionMenu.vue │ │ ├── Alert.vue │ │ ├── AsyncButton.vue │ │ ├── BackendProgress.vue │ │ ├── ContainerLogs.vue │ │ ├── ContainerShell.vue │ │ ├── ContainerStatusBadge.vue │ │ ├── DashboardOpen.vue │ │ ├── DiagnosticsBody.vue │ │ ├── DiagnosticsButtonRun.vue │ │ ├── EmptyState.vue │ │ ├── EngineSelector.vue │ │ ├── ExtensionsError.vue │ │ ├── ExtensionsUninstalled.vue │ │ ├── Help.vue │ │ ├── ImageAddTabs.vue │ │ ├── Images.vue │ │ ├── ImagesButtonAdd.vue │ │ ├── ImagesFormAdd.vue │ │ ├── ImagesOutputWindow.vue │ │ ├── ImagesScanResults.vue │ │ ├── IncompatiblePreferencesAlert.vue │ │ ├── LoadingIndicator.vue │ │ ├── MarketplaceCard.vue │ │ ├── MarketplaceCatalog.vue │ │ ├── MountTypeSelector.vue │ │ ├── Nav.vue │ │ ├── NavIconExtension.vue │ │ ├── NavItem.vue │ │ ├── NetworkStatus.vue │ │ ├── Notifications.vue │ │ ├── PathManagementSelector.vue │ │ ├── PortForwarding.vue │ │ ├── Preferences/ │ │ │ ├── Alert.vue │ │ │ ├── ApplicationBehavior.vue │ │ │ ├── ApplicationEnvironment.vue │ │ │ ├── ApplicationGeneral.vue │ │ │ ├── BodyApplication.vue │ │ │ ├── BodyContainerEngine.vue │ │ │ ├── BodyKubernetes.vue │ │ │ ├── BodyVirtualMachine.vue │ │ │ ├── BodyWsl.vue │ │ │ ├── ButtonOpen.vue │ │ │ ├── ContainerEngineAllowedImages.vue │ │ │ ├── ContainerEngineGeneral.vue │ │ │ ├── Help.vue │ │ │ ├── ModalBody.vue │ │ │ ├── ModalFooter.vue │ │ │ ├── ModalHeader.vue │ │ │ ├── ModalNav.vue │ │ │ ├── ModalNavItem.vue │ │ │ ├── VirtualMachineEmulation.vue │ │ │ ├── VirtualMachineHardware.vue │ │ │ ├── VirtualMachineVolumes.vue │ │ │ ├── WslIntegrations.vue │ │ │ └── WslProxy.vue │ │ ├── RdInput.vue │ │ ├── RdProgress.vue │ │ ├── RdSelect.vue │ │ ├── SnapshotCard.vue │ │ ├── Snapshots.vue │ │ ├── SnapshotsButtonCreate.vue │ │ ├── SortableTable/ │ │ │ ├── THead.vue │ │ │ ├── actions.js │ │ │ ├── advanced-filtering.js │ │ │ ├── debug.js │ │ │ ├── filtering.js │ │ │ ├── grouping.js │ │ │ ├── index.vue │ │ │ ├── paging.js │ │ │ ├── selection.js │ │ │ ├── sortable-config.ts │ │ │ └── sorting.js │ │ ├── StatusBar.vue │ │ ├── StatusBarItem.vue │ │ ├── SystemPreferences.vue │ │ ├── Tabbed/ │ │ │ ├── RdTabbed.vue │ │ │ ├── Tab.vue │ │ │ └── index.vue │ │ ├── TelemetryOptIn.vue │ │ ├── TheTitle.vue │ │ ├── TroubleshootingLineItem.vue │ │ ├── UpdateStatus.vue │ │ ├── Version.vue │ │ ├── WSLIntegration.vue │ │ ├── __tests__/ │ │ │ ├── BackendProgress.spec.ts │ │ │ ├── PreferencesButton.spec.ts │ │ │ ├── StatusBar.spec.ts │ │ │ ├── SystemPreferences.spec.js │ │ │ └── UpdateStatus.spec.ts │ │ └── form/ │ │ ├── LabeledBadge.vue │ │ ├── LabeledSelect.vue │ │ ├── LabeledTooltip.vue │ │ ├── RdCheckbox.vue │ │ ├── RdFieldset.vue │ │ ├── RdSlider.vue │ │ ├── SplitButton.vue │ │ ├── TextAreaAutoGrow.vue │ │ ├── TooltipIcon.vue │ │ ├── __tests__/ │ │ │ └── SplitButton.spec.ts │ │ └── labeled-select-utils/ │ │ └── labeled-select-pagination.ts │ ├── config/ │ │ ├── __tests__/ │ │ │ ├── commandLineOptions.spec.ts │ │ │ ├── settings.spec.ts │ │ │ └── settingsMigrations.spec.ts │ │ ├── commandLineOptions.ts │ │ ├── cookies.js │ │ ├── emptyStubForJSLinter.js │ │ ├── help.ts │ │ ├── private-label.js │ │ ├── query-params.js │ │ ├── settings.ts │ │ ├── settingsImpl.ts │ │ ├── transientSettings.ts │ │ └── types.js │ ├── entry/ │ │ ├── README.md │ │ ├── index.ts │ │ ├── plugins.ts │ │ ├── router.ts │ │ └── store.ts │ ├── hocs/ │ │ ├── README.md │ │ └── withCredentials.ts │ ├── index.ts │ ├── integrations/ │ │ ├── __tests__/ │ │ │ ├── manageLinesInFile.spec.ts │ │ │ ├── pathManager.spec.ts │ │ │ ├── unixIntegrationManager.spec.ts │ │ │ └── windowsIntegrationManager.spec.ts │ │ ├── integrationManager.ts │ │ ├── manageLinesInFile.ts │ │ ├── pathManager.ts │ │ ├── pathManagerImpl.ts │ │ ├── unixIntegrationManager.ts │ │ └── windowsIntegrationManager.ts │ ├── layouts/ │ │ ├── default.vue │ │ ├── dialog.vue │ │ └── preferences.vue │ ├── main/ │ │ ├── __tests__/ │ │ │ ├── containerExec.spec.ts │ │ │ ├── deploymentProfiles.spec.ts │ │ │ └── ipcMain.spec.ts │ │ ├── commandServer/ │ │ │ ├── __tests__/ │ │ │ │ └── settingsValidator.spec.ts │ │ │ ├── httpCommandServer.ts │ │ │ └── settingsValidator.ts │ │ ├── containerExec.ts │ │ ├── credentialServer/ │ │ │ ├── README.md │ │ │ ├── __tests__/ │ │ │ │ └── credentialUtils.spec.ts │ │ │ ├── credentialUtils.ts │ │ │ └── httpCredentialHelperServer.ts │ │ ├── dashboardServer/ │ │ │ ├── index.ts │ │ │ └── proxyUtils.ts │ │ ├── deploymentProfiles.ts │ │ ├── diagnostics/ │ │ │ ├── __tests__/ │ │ │ │ ├── diagnostics.spec.ts │ │ │ │ ├── dockerCliSymlinks.spec.ts │ │ │ │ └── rdBinInShell.spec.ts │ │ │ ├── connectedToInternet.ts │ │ │ ├── diagnostics.ts │ │ │ ├── dockerCliSymlinks.ts │ │ │ ├── dockerContext.ts │ │ │ ├── integrationsWindows.ts │ │ │ ├── kubeConfigSymlink.ts │ │ │ ├── kubeContext.ts │ │ │ ├── kubeVersionsAvailable.ts │ │ │ ├── limaDarwin.ts │ │ │ ├── limaOverrides.ts │ │ │ ├── mobyImageStore.ts │ │ │ ├── mockForScreenshots.ts │ │ │ ├── pathManagement.ts │ │ │ ├── rdBinInShell.ts │ │ │ ├── testCheckers.ts │ │ │ ├── types.ts │ │ │ ├── wslDistros.ts │ │ │ └── wslInfo.ts │ │ ├── extensions/ │ │ │ ├── __tests__/ │ │ │ │ ├── extensions.spec.ts │ │ │ │ └── manager.spec.ts │ │ │ ├── extensions.ts │ │ │ ├── index.ts │ │ │ ├── manager.ts │ │ │ └── types.ts │ │ ├── imageEvents.ts │ │ ├── ipcMain.ts │ │ ├── mainEvents.ts │ │ ├── mainmenu.ts │ │ ├── networking/ │ │ │ ├── __tests__/ │ │ │ │ └── mac-ca.spec.ts │ │ │ ├── cert-parse.ts │ │ │ ├── index.ts │ │ │ ├── linux-ca.ts │ │ │ ├── mac-ca.ts │ │ │ ├── proxy.ts │ │ │ └── win-ca.ts │ │ ├── serverHelper.ts │ │ ├── snapshots/ │ │ │ ├── snapshots.ts │ │ │ └── types.ts │ │ ├── tray.ts │ │ └── update/ │ │ ├── LonghornProvider.ts │ │ ├── MSIUpdater.ts │ │ ├── __tests__/ │ │ │ └── LonghornProvider.spec.ts │ │ └── index.ts │ ├── middleware/ │ │ ├── i18n.js │ │ └── indexRedirect.js │ ├── mixins/ │ │ ├── compact-input.ts │ │ ├── labeled-form-element.ts │ │ └── vue-select-overrides.js │ ├── pages/ │ │ ├── Containers.vue │ │ ├── DenyRoot.vue │ │ ├── Diagnostics.vue │ │ ├── Dialog.vue │ │ ├── Extensions.vue │ │ ├── FirstRun.vue │ │ ├── General.vue │ │ ├── Images.vue │ │ ├── KubernetesError.vue │ │ ├── PortForwarding.vue │ │ ├── Preferences.vue │ │ ├── Snapshots.vue │ │ ├── SudoPrompt.vue │ │ ├── Troubleshooting.vue │ │ ├── UnmetPrerequisites.vue │ │ ├── Volumes.vue │ │ ├── containers/ │ │ │ └── ContainerInfo.vue │ │ ├── extensions/ │ │ │ ├── _root/ │ │ │ │ └── _src/ │ │ │ │ └── _id.vue │ │ │ └── installed.vue │ │ ├── images/ │ │ │ ├── add.vue │ │ │ └── scans/ │ │ │ └── _image-name.vue │ │ ├── snapshots/ │ │ │ ├── create.vue │ │ │ └── dialog.vue │ │ └── volumes/ │ │ └── files/ │ │ └── _name.vue │ ├── plugins/ │ │ ├── clean-html-directive.js │ │ ├── clean-tooltip-directive.ts │ │ ├── directives.js │ │ ├── i18n.js │ │ ├── shortkey.js │ │ ├── tooltip.ts │ │ ├── trim-whitespace.js │ │ └── v-select.js │ ├── preload/ │ │ ├── README.md │ │ ├── extensions.ts │ │ └── index.ts │ ├── product.js │ ├── public/ │ │ └── index.html │ ├── store/ │ │ ├── action-menu.js │ │ ├── applicationSettings.ts │ │ ├── container-engine.ts │ │ ├── credentials.ts │ │ ├── diagnostics.ts │ │ ├── extensions.ts │ │ ├── i18n.js │ │ ├── imageManager.ts │ │ ├── k8sManager.js │ │ ├── page.ts │ │ ├── preferences.ts │ │ ├── prefs.js │ │ ├── resource-fetch.js │ │ ├── snapshots.ts │ │ ├── transientSettings.ts │ │ └── ts-helpers.ts │ ├── sudo-prompt/ │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── package.json │ │ ├── test-concurrent.js │ │ └── test.js │ ├── tsconfig.json │ ├── types/ │ │ └── components/ │ │ └── labeledSelect.ts │ ├── typings/ │ │ ├── assets.d.ts │ │ ├── electron-ipc.d.ts │ │ ├── linux-ca.d.ts │ │ ├── rdx.d.ts │ │ ├── shell.d.ts │ │ ├── shims-vue.d.ts │ │ ├── store.d.ts │ │ ├── unix.interface.ts │ │ └── vue-i18n.ts │ ├── utils/ │ │ ├── DownloadProgressListener.ts │ │ ├── __tests__/ │ │ │ ├── childProcess.spec.ts │ │ │ ├── dockerDirManager.spec.ts │ │ │ ├── dockerUtils.spec.ts │ │ │ ├── iterator.spec.ts │ │ │ ├── kubeVersions.spec.ts │ │ │ ├── paths.spec.ts │ │ │ └── safeRename.spec.ts │ │ ├── array.ts │ │ ├── backgroundProcess.ts │ │ ├── childProcess.ts │ │ ├── clone.ts │ │ ├── commandLine.ts │ │ ├── dateUtils.ts │ │ ├── dockerDirManager.ts │ │ ├── dockerUtils.ts │ │ ├── dom.js │ │ ├── environment.ts │ │ ├── eventEmitter.ts │ │ ├── filters.ts │ │ ├── imageOutputCuller.ts │ │ ├── ipcRenderer.ts │ │ ├── iterator.ts │ │ ├── kubeVersions.ts │ │ ├── latch.ts │ │ ├── logging.ts │ │ ├── networks.ts │ │ ├── object.js │ │ ├── osVersion.ts │ │ ├── paths.ts │ │ ├── platform.js │ │ ├── position.js │ │ ├── processOutputInterpreters/ │ │ │ ├── __tests__/ │ │ │ │ ├── assets/ │ │ │ │ │ ├── build.txt │ │ │ │ │ ├── pull.txt │ │ │ │ │ ├── pull03.txt │ │ │ │ │ ├── pull2.txt │ │ │ │ │ ├── push.txt │ │ │ │ │ ├── trivy-image-metric-server-input.txt │ │ │ │ │ ├── trivy-image-metric-server-output.txt │ │ │ │ │ ├── trivy-image-postgres-input.txt │ │ │ │ │ └── trivy-image-postgres-output.txt │ │ │ │ ├── image-build-output.spec.js │ │ │ │ ├── image-non-build-output.spec.js │ │ │ │ └── trivy-image-output.spec.js │ │ │ ├── image-build-output.ts │ │ │ ├── image-non-build-output.ts │ │ │ └── trivy-image-output.ts │ │ ├── protocols.ts │ │ ├── resources.ts │ │ ├── safeRename.ts │ │ ├── select.js │ │ ├── shortcuts.ts │ │ ├── sort.js │ │ ├── string-encode.ts │ │ ├── string.js │ │ ├── stringify.ts │ │ ├── testUtils/ │ │ │ ├── mockModules.ts │ │ │ ├── mockResources.ts │ │ │ ├── setupVue.ts │ │ │ └── vue-jest.js │ │ ├── type-helpers.ts │ │ ├── typeUtils.ts │ │ ├── units.js │ │ ├── version.ts │ │ ├── width.js │ │ └── wslVersion.ts │ ├── vue.config.mjs │ └── window/ │ ├── constants.ts │ ├── dashboard.ts │ ├── index.ts │ ├── preferenceConstants.ts │ └── preferences.ts ├── resources/ │ ├── k3s-versions.json │ └── setup-spin ├── screenshots/ │ ├── README.md │ ├── Screenshots.ts │ ├── playwright-config.ts │ ├── screenshot.ps1 │ ├── screenshots.e2e.spec.ts │ ├── set-display-resolution.ps1 │ └── test-data/ │ ├── containers.ts │ ├── images.ts │ ├── preferences.ts │ ├── snapshots.ts │ └── volumes.ts ├── scripts/ │ ├── assets/ │ │ ├── extension-data.yaml │ │ └── options.go.templ │ ├── build.ts │ ├── check-api-schema.ts │ ├── dependencies/ │ │ ├── go-source.ts │ │ ├── lima.ts │ │ ├── moby-openapi.ts │ │ ├── sudo-prompt.ts │ │ ├── tar-archives.ts │ │ ├── tools.ts │ │ ├── wix.ts │ │ └── wsl.ts │ ├── dev.ts │ ├── docker-cli-monitor.ts │ ├── e2e.ts │ ├── extension-data.ts │ ├── generateCliCode.ts │ ├── go-license-check.sh │ ├── go.mod │ ├── go.sum │ ├── install-latest-ci.sh │ ├── k3s-versions.go │ ├── k3s-versions.sh │ ├── lib/ │ │ ├── build-utils.ts │ │ ├── dependencies.ts │ │ ├── download.ts │ │ ├── extension-data.ts │ │ ├── installer-win32-gen.tsx │ │ ├── installer-win32.tsx │ │ ├── sign-macos.ts │ │ └── sign-win32.ts │ ├── lint-go.ts │ ├── lint-typescript.ts │ ├── package.ts │ ├── populate-update-server.ts │ ├── postinstall.ts │ ├── rddepman.ts │ ├── release-merge-to-main.ts │ ├── sign.ts │ ├── simple_process.ts │ ├── spelling.sh │ ├── ts-wrapper.js │ ├── unreleased-change-monitor.ts │ ├── windows/ │ │ ├── generate-nerdctl-stub.ps1 │ │ ├── install-wsl.ps1 │ │ ├── restart-helpers.ps1 │ │ ├── sudo-install-wsl.ps1 │ │ └── uninstall-wsl.ps1 │ ├── windows-setup.ps1 │ ├── wix.ts │ └── yarn-dedupe.sh ├── src/ │ ├── go/ │ │ ├── docker-credential-none/ │ │ │ ├── dcnone/ │ │ │ │ ├── dcnone.go │ │ │ │ ├── dcnone_test.go │ │ │ │ └── helpers.go │ │ │ ├── go.mod │ │ │ ├── go.sum │ │ │ └── main.go │ │ ├── extension-proxy/ │ │ │ ├── README.md │ │ │ ├── go.mod │ │ │ └── main.go │ │ ├── guestagent/ │ │ │ ├── README.md │ │ │ ├── go.mod │ │ │ ├── go.sum │ │ │ ├── main.go │ │ │ └── pkg/ │ │ │ ├── containerd/ │ │ │ │ ├── events_linux.go │ │ │ │ └── events_stub.go │ │ │ ├── docker/ │ │ │ │ └── events.go │ │ │ ├── forwarder/ │ │ │ │ ├── forwarder.go │ │ │ │ ├── serviceapi.go │ │ │ │ └── wslproxy.go │ │ │ ├── iptables/ │ │ │ │ ├── iptables.go │ │ │ │ ├── iptables_test.go │ │ │ │ └── scanner.go │ │ │ ├── kube/ │ │ │ │ ├── servicewatcher_linux.go │ │ │ │ ├── watcher_linux.go │ │ │ │ └── watcher_stub.go │ │ │ ├── procnet/ │ │ │ │ ├── scanner_linux.go │ │ │ │ └── scanner_stub.go │ │ │ ├── tracker/ │ │ │ │ ├── apitracker.go │ │ │ │ ├── apitracker_test.go │ │ │ │ ├── portstorage.go │ │ │ │ └── tracker.go │ │ │ ├── types/ │ │ │ │ ├── README.md │ │ │ │ └── portmapping.go │ │ │ └── utils/ │ │ │ └── utils.go │ │ ├── mock-wsl/ │ │ │ ├── README.md │ │ │ ├── go.mod │ │ │ ├── go.sum │ │ │ ├── lock_file_other.go │ │ │ ├── lock_file_windows.go │ │ │ ├── mock-wsl.go │ │ │ └── schema.json │ │ ├── nerdctl-stub/ │ │ │ ├── README.md │ │ │ ├── command_handlers.go │ │ │ ├── command_handlers_test.go │ │ │ ├── debugging.go │ │ │ ├── debugging_stub.go │ │ │ ├── generate/ │ │ │ │ ├── README.md │ │ │ │ ├── go.mod │ │ │ │ ├── go.sum │ │ │ │ ├── main_linux.go │ │ │ │ └── main_stub.go │ │ │ ├── go.mod │ │ │ ├── go.sum │ │ │ ├── main.go │ │ │ ├── main_linux.go │ │ │ ├── main_shared.go │ │ │ ├── main_shared_test.go │ │ │ ├── main_unsupported.go │ │ │ ├── main_windows.go │ │ │ ├── nerdctl_commands_generated.go │ │ │ ├── parse_args.go │ │ │ └── parse_args_test.go │ │ ├── networking/ │ │ │ ├── .github/ │ │ │ │ └── workflows/ │ │ │ │ ├── go.yaml │ │ │ │ └── release.yaml │ │ │ ├── .gitignore │ │ │ ├── LICENSE │ │ │ ├── Makefile │ │ │ ├── README.md │ │ │ ├── cmd/ │ │ │ │ ├── host/ │ │ │ │ │ ├── config_windows.go │ │ │ │ │ └── switch_windows.go │ │ │ │ ├── network/ │ │ │ │ │ └── setup_linux.go │ │ │ │ ├── proxy/ │ │ │ │ │ └── wsl_integration_linux.go │ │ │ │ └── vm/ │ │ │ │ └── switch_linux.go │ │ │ ├── go.mod │ │ │ ├── go.sum │ │ │ └── pkg/ │ │ │ ├── config/ │ │ │ │ └── config.go │ │ │ ├── log/ │ │ │ │ └── log.go │ │ │ ├── portproxy/ │ │ │ │ ├── server.go │ │ │ │ └── server_test.go │ │ │ ├── utils/ │ │ │ │ └── pipe.go │ │ │ └── vsock/ │ │ │ ├── conn_windows.go │ │ │ ├── constants.go │ │ │ └── handshake_windows.go │ │ ├── rdctl/ │ │ │ ├── README.md │ │ │ ├── cmd/ │ │ │ │ ├── api.go │ │ │ │ ├── createProfile.go │ │ │ │ ├── enum.go │ │ │ │ ├── extension.go │ │ │ │ ├── extensionInstall.go │ │ │ │ ├── extensionList.go │ │ │ │ ├── extensionUninstall.go │ │ │ │ ├── factoryReset.go │ │ │ │ ├── info.go │ │ │ │ ├── internal.go │ │ │ │ ├── internalProcess.go │ │ │ │ ├── internalProcessWaitKill.go │ │ │ │ ├── listSettings.go │ │ │ │ ├── paths.go │ │ │ │ ├── reset.go │ │ │ │ ├── root.go │ │ │ │ ├── set.go │ │ │ │ ├── setup.go │ │ │ │ ├── shell.go │ │ │ │ ├── shutdown.go │ │ │ │ ├── snapshot.go │ │ │ │ ├── snapshotCreate.go │ │ │ │ ├── snapshotDelete.go │ │ │ │ ├── snapshotList.go │ │ │ │ ├── snapshotList_test.go │ │ │ │ ├── snapshotRestore.go │ │ │ │ ├── snapshotUnlock.go │ │ │ │ ├── start.go │ │ │ │ └── version.go │ │ │ ├── go.mod │ │ │ ├── go.sum │ │ │ ├── main.go │ │ │ └── pkg/ │ │ │ ├── autostart/ │ │ │ │ ├── autostart_darwin.go │ │ │ │ ├── autostart_linux.go │ │ │ │ └── autostart_windows.go │ │ │ ├── client/ │ │ │ │ ├── client.go │ │ │ │ ├── handle_unix.go │ │ │ │ ├── handle_windows.go │ │ │ │ └── utils.go │ │ │ ├── command/ │ │ │ │ └── command.go │ │ │ ├── config/ │ │ │ │ ├── config.go │ │ │ │ └── config_test.go │ │ │ ├── directories/ │ │ │ │ ├── directories.go │ │ │ │ ├── directories_test.go │ │ │ │ ├── directories_windows.go │ │ │ │ ├── directories_windows_test.go │ │ │ │ ├── empty.go │ │ │ │ └── lima_home.go │ │ │ ├── factoryreset/ │ │ │ │ ├── delete_data.go │ │ │ │ ├── delete_data_darwin.go │ │ │ │ ├── delete_data_linux.go │ │ │ │ ├── delete_data_unix.go │ │ │ │ ├── delete_data_unix_test.go │ │ │ │ ├── delete_data_windows.go │ │ │ │ ├── factory_reset_unix.go │ │ │ │ └── factory_reset_windows.go │ │ │ ├── info/ │ │ │ │ ├── ipaddress.go │ │ │ │ ├── struct.go │ │ │ │ └── version.go │ │ │ ├── lima/ │ │ │ │ └── name.go │ │ │ ├── lock/ │ │ │ │ ├── lock.go │ │ │ │ └── mock.go │ │ │ ├── paths/ │ │ │ │ ├── paths.go │ │ │ │ ├── paths_darwin.go │ │ │ │ ├── paths_darwin_test.go │ │ │ │ ├── paths_linux.go │ │ │ │ ├── paths_linux_test.go │ │ │ │ ├── paths_test.go │ │ │ │ ├── paths_unix.go │ │ │ │ ├── paths_windows.go │ │ │ │ └── paths_windows_test.go │ │ │ ├── plist/ │ │ │ │ ├── plist.go │ │ │ │ └── plist_test.go │ │ │ ├── process/ │ │ │ │ ├── process_darwin.go │ │ │ │ ├── process_linux.go │ │ │ │ ├── process_test.go │ │ │ │ ├── process_unix.go │ │ │ │ ├── process_windows.go │ │ │ │ └── process_windows_test.go │ │ │ ├── reg/ │ │ │ │ ├── reg.go │ │ │ │ └── reg_test.go │ │ │ ├── runner/ │ │ │ │ ├── runner.go │ │ │ │ └── runner_test.go │ │ │ ├── shell/ │ │ │ │ └── shell.go │ │ │ ├── shutdown/ │ │ │ │ └── shutdown.go │ │ │ ├── snapshot/ │ │ │ │ ├── copyFile_darwin.go │ │ │ │ ├── copyFile_linux.go │ │ │ │ ├── manager.go │ │ │ │ ├── manager_test.go │ │ │ │ ├── manager_unix_test.go │ │ │ │ ├── manager_windows_test.go │ │ │ │ ├── snapshot.go │ │ │ │ ├── snapshotter.go │ │ │ │ ├── snapshotter_unix.go │ │ │ │ └── snapshotter_windows.go │ │ │ ├── utils/ │ │ │ │ └── utils.go │ │ │ ├── version/ │ │ │ │ └── version.go │ │ │ └── wsl/ │ │ │ ├── doc.go │ │ │ ├── mock_windows.go │ │ │ ├── names.go │ │ │ └── wsl_windows.go │ │ ├── spin-stub/ │ │ │ ├── README.md │ │ │ ├── go.mod │ │ │ └── main.go │ │ ├── startup-profile/ │ │ │ ├── .gitignore │ │ │ ├── README.md │ │ │ ├── go.mod │ │ │ ├── go.sum │ │ │ ├── main.go │ │ │ ├── model/ │ │ │ │ └── event.go │ │ │ ├── parsers/ │ │ │ │ ├── const.go │ │ │ │ ├── dmesg.go │ │ │ │ ├── interface.go │ │ │ │ ├── lima-ha.go │ │ │ │ ├── lima-init.go │ │ │ │ ├── networking.go │ │ │ │ ├── progress.go │ │ │ │ ├── rc.go │ │ │ │ ├── windows-guest-agent.go │ │ │ │ ├── windows-integration.go │ │ │ │ └── wsl-helper.go │ │ │ ├── rdctl/ │ │ │ │ └── rdctl.go │ │ │ ├── render/ │ │ │ │ ├── model.go │ │ │ │ ├── process.go │ │ │ │ └── render.go │ │ │ └── run.go │ │ └── wsl-helper/ │ │ ├── .gitignore │ │ ├── cmd/ │ │ │ ├── certificates_windows.go │ │ │ ├── dockerproxy.go │ │ │ ├── dockerproxy_kill_linux.go │ │ │ ├── dockerproxy_serve_linux.go │ │ │ ├── dockerproxy_serve_windows.go │ │ │ ├── dockerproxy_start.go │ │ │ ├── enum.go │ │ │ ├── k3s.go │ │ │ ├── k3s_kubeconfig.go │ │ │ ├── kubeconfig.go │ │ │ ├── process_kill_windows.go │ │ │ ├── process_spawn_windows.go │ │ │ ├── process_windows.go │ │ │ ├── root.go │ │ │ ├── version.go │ │ │ ├── wsl.go │ │ │ ├── wsl_info.go │ │ │ ├── wsl_integration_docker_linux.go │ │ │ ├── wsl_integration_linux.go │ │ │ └── wsl_integration_state_linux.go │ │ ├── go.mod │ │ ├── go.sum │ │ ├── main.go │ │ ├── pkg/ │ │ │ ├── certificates/ │ │ │ │ ├── certificates_windows.go │ │ │ │ └── certificates_windows_test.go │ │ │ ├── dockerproxy/ │ │ │ │ ├── defaults.go │ │ │ │ ├── generate.go │ │ │ │ ├── models/ │ │ │ │ │ └── doc.go │ │ │ │ ├── mungers/ │ │ │ │ │ ├── containers_create_linux.go │ │ │ │ │ ├── containers_create_linux_test.go │ │ │ │ │ ├── containers_create_windows.go │ │ │ │ │ ├── containers_create_windows_test.go │ │ │ │ │ ├── doc.go │ │ │ │ │ ├── helpers.go │ │ │ │ │ └── helpers_linux.go │ │ │ │ ├── platform/ │ │ │ │ │ ├── hyperv.go │ │ │ │ │ ├── hyperv_test.go │ │ │ │ │ ├── serve_linux.go │ │ │ │ │ ├── serve_windows.go │ │ │ │ │ ├── serve_windows_test.go │ │ │ │ │ ├── vsock_linux.go │ │ │ │ │ └── wsl_mountpoint_linux.go │ │ │ │ ├── serve.go │ │ │ │ ├── start.go │ │ │ │ ├── swagger-configuration.yaml │ │ │ │ └── util/ │ │ │ │ ├── pipe.go │ │ │ │ ├── pipe_test.go │ │ │ │ ├── reverse_proxy.go │ │ │ │ └── reverse_proxy_test.go │ │ │ ├── integration/ │ │ │ │ ├── docker_linux.go │ │ │ │ ├── docker_linux_test.go │ │ │ │ └── integration.go │ │ │ ├── process/ │ │ │ │ ├── imports_windows.go │ │ │ │ ├── kill_others_linux.go │ │ │ │ ├── kill_windows.go │ │ │ │ ├── run_windows.go │ │ │ │ └── wait_windows.go │ │ │ ├── version/ │ │ │ │ └── version.go │ │ │ └── wsl-utils/ │ │ │ ├── doc.go │ │ │ ├── install_windows.go │ │ │ ├── run_windows.go │ │ │ ├── version_windows.go │ │ │ └── version_windows_test.go │ │ └── wix/ │ │ ├── check_windows.go │ │ ├── doc.go │ │ ├── helpers_windows.go │ │ ├── imports_windows.go │ │ ├── install_windows.go │ │ └── main_windows.go │ └── sudo-prompt/ │ ├── build-sudo-prompt │ ├── sudo-prompt-script │ └── sudo-prompt.applescript └── tsconfig.json
Showing preview only (324K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3588 symbols across 504 files)
FILE: .github/workflows/bats/get-tests.py
class Result (line 25) | class Result:
function resolve_test (line 40) | def resolve_test(test: str, platform: Platforms) -> Iterator[str]:
function skip_test (line 54) | def skip_test(test: Result) -> bool:
FILE: .github/workflows/bats/summarize.mjs
class Run (line 25) | class Run {
method ok (line 49) | get ok() { return this.passed + this.skipped }
method succeeded (line 51) | get succeeded() { return this.ok == this.total }
method version (line 53) | get version() {
method column (line 72) | get column() { return `${ this.os } ${ this.engine }` }
function readRuns (line 79) | async function readRuns() {
function printVersions (line 138) | async function printVersions(runs, output) {
function getRunMetadata (line 177) | async function getRunMetadata(infoType) {
function updateRunInfo (line 207) | async function updateRunInfo(runs) {
function printResults (line 247) | async function printResults(runs, output) {
FILE: background.ts
constant SNAPSHOT_OPERATION (line 83) | const SNAPSHOT_OPERATION = 'Snapshot operation in progress';
function setPathManager (line 329) | async function setPathManager(newStrategy: PathManagementStrategy) {
function readBackendLockFile (line 343) | async function readBackendLockFile(): Promise<{ action: string } | null> {
function updateBackendLockState (line 363) | function updateBackendLockState(backendIsLocked: string, action?: string...
function doesBackendLockExist (line 372) | async function doesBackendLockExist(): Promise<boolean> {
function checkForBackendLock (line 391) | async function checkForBackendLock() {
function initUI (line 415) | async function initUI() {
function doFirstRunDialog (line 446) | async function doFirstRunDialog() {
function checkForRootPrivs (line 453) | async function checkForRootPrivs() {
function checkPrerequisites (line 461) | async function checkPrerequisites() {
function checkBackendValid (line 531) | async function checkBackendValid() {
function startBackend (line 546) | async function startBackend() {
function startK8sManager (line 578) | async function startK8sManager() {
function setupImageProcessor (line 611) | function setupImageProcessor() {
type K8sError (line 626) | interface K8sError {
function isK8sError (line 630) | function isK8sError(object: any): object is K8sError {
function writeSettings (line 736) | function writeSettings(arg: RecursivePartial<RecursiveReadonly<settings....
function backendIsBusy (line 798) | function backendIsBusy() {
function doK8sReset (line 802) | async function doK8sReset(arg: 'fast' | 'wipe' | 'fullRestart', context:...
function doForwardPort (line 894) | async function doForwardPort(namespace: string, service: string, k8sPort...
function doCancelForward (line 898) | async function doCancelForward(namespace: string, service: string, k8sPo...
function doFactoryReset (line 923) | async function doFactoryReset(keepSystemImages: boolean) {
function showErrorDialog (line 1180) | function showErrorDialog(title: string, message: string, fatal?: boolean) {
function handleFailure (line 1191) | async function handleFailure(payload: any) {
function doFullRestart (line 1253) | function doFullRestart(context: CommandWorkerInterface.CommandContext) {
function getExtensionManager (line 1259) | async function getExtensionManager() {
function newK8sManager (line 1265) | function newK8sManager() {
function validateEarlySettings (line 1333) | function validateEarlySettings(cfg: settings.Settings, newSettings: Recu...
class BackgroundCommandWorker (line 1355) | class BackgroundCommandWorker implements CommandWorkerInterface {
method validateSettings (line 1362) | protected async validateSettings(existingSettings: settings.Settings, ...
method getSettings (line 1391) | getSettings() {
method getLockedSettings (line 1395) | getLockedSettings() {
method getDiagnosticCategories (line 1399) | getDiagnosticCategories(): string[] | undefined {
method getDiagnosticIdsByCategory (line 1403) | getDiagnosticIdsByCategory(category: string): string[] | undefined {
method getDiagnosticChecks (line 1407) | getDiagnosticChecks(category: string | null, checkID: string | null): ...
method runDiagnosticChecks (line 1411) | runDiagnosticChecks(): Promise<DiagnosticsResultCollection> {
method factoryReset (line 1415) | factoryReset(keepSystemImages: boolean) {
method k8sReset (line 1419) | async k8sReset(context: CommandWorkerInterface.CommandContext, mode: '...
method forwardPort (line 1423) | async forwardPort(namespace: string, service: string, k8sPort: string ...
method cancelForward (line 1427) | async cancelForward(namespace: string, service: string, k8sPort: strin...
method handleSettingsUpdate (line 1434) | async handleSettingsUpdate(newConfig: settings.Settings): Promise<void> {
method updateSettings (line 1462) | async updateSettings(context: CommandWorkerInterface.CommandContext, s...
method proposeSettings (line 1510) | async proposeSettings(context: CommandWorkerInterface.CommandContext, ...
method requestShutdown (line 1521) | async requestShutdown() {
method getTransientSettings (line 1528) | getTransientSettings() {
method updateTransientSettings (line 1532) | updateTransientSettings(
method listExtensions (line 1552) | async listExtensions() {
method installExtension (line 1568) | async installExtension(image: string, state: 'install' | 'uninstall'):...
method getBackendState (line 1625) | async getBackendState(): Promise<BackendState> {
method setBackendState (line 1634) | async setBackendState(state: BackendState): Promise<void> {
method listSnapshots (line 1657) | async listSnapshots(context: CommandWorkerInterface.CommandContext) {
method createSnapshot (line 1661) | async createSnapshot(context: CommandWorkerInterface.CommandContext, s...
method restoreSnapshot (line 1665) | async restoreSnapshot(context: CommandWorkerInterface.CommandContext, ...
method cancelSnapshot (line 1669) | async cancelSnapshot() {
method deleteSnapshot (line 1673) | async deleteSnapshot(context: CommandWorkerInterface.CommandContext, n...
function isRoot (line 1681) | function isRoot(): boolean {
function runRdctlSetup (line 1691) | async function runRdctlSetup(newSettings: settings.Settings): Promise<vo...
FILE: bats/tests/compose/testdata/app/app.py
function hello (line 5) | def hello():
FILE: bats/tests/extensions/testdata/bin/dummy.go
function main (line 10) | func main() {
FILE: bats/tests/extensions/testdata/bin/server.go
constant addr (line 22) | addr = "/run/guest-services/hello.sock"
function listen (line 26) | func listen() (net.Listener, error) {
function handlePost (line 43) | func handlePost(w http.ResponseWriter, req *http.Request) {
function handleWithStatus (line 62) | func handleWithStatus(w http.ResponseWriter, req *http.Request) {
function main (line 74) | func main() {
FILE: build/electron-publisher-custom.js
class LonghornPublisher (line 9) | class LonghornPublisher extends electronPublish.Publisher {
method toString (line 11) | toString() {
method upload (line 15) | upload() {
method checkAndResolveOptions (line 24) | static async checkAndResolveOptions(options) {
FILE: e2e/backend.e2e.spec.ts
function get (line 69) | async function get(requestPath: string) {
function put (line 78) | async function put(requestPath: string, body: any) {
type ExpectedDefinition (line 142) | type ExpectedDefinition = Partial<Record<RecursiveKeys<Settings>, boolea...
FILE: e2e/containers.e2e.spec.ts
function navigateToShellTab (line 344) | async function navigateToShellTab() {
FILE: e2e/credentials-server.e2e.spec.ts
type entryType (line 47) | interface entryType {
function makeEntry (line 53) | function makeEntry(url: string, username: string, secret: string): entry...
function haveCredentialServerHelper (line 65) | function haveCredentialServerHelper(): boolean {
function doRequest (line 118) | async function doRequest(path: string, body = '', ignoreStderr = false) {
function doRequestExpectStatus (line 137) | async function doRequestExpectStatus(path: string, body: string, expecte...
function addEntry (line 148) | async function addEntry(helper: string, entry: entryType): Promise<void> {
function listEntries (line 155) | async function listEntries(helper: string, matcher: string): Promise<Rec...
function removeEntries (line 169) | async function removeEntries(helper: string, matcher: string) {
function rdctlPath (line 201) | function rdctlPath() {
function rdctlCredWithStdin (line 205) | async function rdctlCredWithStdin(command: string, input?: string): Prom...
FILE: e2e/extensions.e2e.spec.ts
constant NAMESPACE (line 34) | const NAMESPACE = 'rancher-desktop-extensions';
function ctrctl (line 41) | async function ctrctl(...args: string[]) {
function evalInView (line 192) | async function evalInView(script: string): Promise<any> {
FILE: e2e/lockedFields.e2e.spec.ts
function rdctlPath (line 47) | function rdctlPath() {
function rdctl (line 51) | async function rdctl(commandArgs: string[]): Promise< { stdout: string, ...
function saveUserProfile (line 61) | async function saveUserProfile() {
function restoreUserProfile (line 68) | async function restoreUserProfile() {
FILE: e2e/pages/container-logs-page.ts
class ContainerLogsPage (line 5) | class ContainerLogsPage {
method constructor (line 19) | constructor(page: Page) {
method waitForLogsToLoad (line 38) | async waitForLogsToLoad() {
method searchLogs (line 43) | async searchLogs(searchTerm: string) {
method scrollToBottom (line 48) | async scrollToBottom() {
method scrollToTop (line 56) | async scrollToTop() {
method getScrollPosition (line 64) | async getScrollPosition(): Promise<number> {
FILE: e2e/pages/container-shell-page.ts
class ContainerShellPage (line 5) | class ContainerShellPage {
method constructor (line 12) | constructor(page: Page) {
method clickTab (line 20) | async clickTab() {
method waitForTerminal (line 31) | async waitForTerminal() {
method runCommand (line 36) | async runCommand(command: string) {
method getTerminalText (line 56) | async getTerminalText(): Promise<string> {
method waitForOutput (line 78) | async waitForOutput(text: string, timeout = 15_000) {
method waitForShellReady (line 93) | async waitForShellReady(timeout = 20_000) {
FILE: e2e/pages/containers-page.ts
type ActionString (line 3) | type ActionString = 'info' | 'stop' | 'start' | 'delete';
class ContainersPage (line 5) | class ContainersPage {
method constructor (line 11) | constructor(page: Page) {
method getContainerRow (line 18) | getContainerRow(containerId: string) {
method waitForContainerToAppear (line 22) | async waitForContainerToAppear(containerId: string, timeout = 30_000) {
method clickContainerAction (line 27) | async clickContainerAction(containerId: string, action: ActionString) {
method viewContainerInfo (line 46) | async viewContainerInfo(containerId: string) {
method stopContainer (line 51) | async stopContainer(containerId: string) {
method startContainer (line 55) | async startContainer(containerId: string) {
method deleteContainer (line 59) | async deleteContainer(containerId: string) {
method getContainerCount (line 63) | async getContainerCount(): Promise<number> {
method waitForTableToLoad (line 68) | async waitForTableToLoad() {
FILE: e2e/pages/diagnostics-page.ts
type CheckerRows (line 3) | interface CheckerRows {
class DiagnosticsPage (line 7) | class DiagnosticsPage {
method constructor (line 11) | constructor(page: Page) {
method checkerRows (line 16) | checkerRows(id: string): CheckerRows {
FILE: e2e/pages/extensions-page.ts
class ExtensionsPage (line 3) | class ExtensionsPage {
method constructor (line 11) | constructor(page: Page) {
FILE: e2e/pages/images-page.ts
class ImagesPage (line 3) | class ImagesPage {
method constructor (line 9) | constructor(page: Page) {
FILE: e2e/pages/k8s-page.ts
class K8sPage (line 2) | class K8sPage {
method constructor (line 11) | constructor(page: Page) {
FILE: e2e/pages/nav-page.ts
class NavPage (line 31) | class NavPage {
method constructor (line 37) | constructor(page: Page) {
method getBackendState (line 44) | protected async getBackendState(): Promise<string> {
method moveToNextState (line 52) | protected async moveToNextState(currentState: string, timeout: number)...
method progressBecomesReady (line 94) | async progressBecomesReady() {
method navigateTo (line 125) | async navigateTo(tab: keyof typeof pageConstructors) {
FILE: e2e/pages/portforward-page.ts
class PortForwardPage (line 2) | class PortForwardPage {
method constructor (line 8) | constructor(page: Page) {
FILE: e2e/pages/preferences/application.ts
class ApplicationNav (line 2) | class ApplicationNav {
method constructor (line 17) | constructor(page: Page) {
FILE: e2e/pages/preferences/containerEngine.ts
class ContainerEngineNav (line 3) | class ContainerEngineNav {
method constructor (line 13) | constructor(page: Page) {
FILE: e2e/pages/preferences/index.ts
class PreferencesPage (line 9) | class PreferencesPage {
method constructor (line 17) | constructor(page: Page) {
FILE: e2e/pages/preferences/kubernetes.ts
class KubernetesNav (line 3) | class KubernetesNav {
method constructor (line 12) | constructor(page: Page) {
FILE: e2e/pages/preferences/virtualMachine.ts
class VirtualMachineNav (line 3) | class VirtualMachineNav {
method constructor (line 24) | constructor(page: Page) {
FILE: e2e/pages/preferences/wsl.ts
class WslNav (line 3) | class WslNav {
method constructor (line 11) | constructor(page: Page) {
FILE: e2e/pages/snapshots-page.ts
class SnapshotsPage (line 3) | class SnapshotsPage {
method constructor (line 10) | constructor(page: Page) {
FILE: e2e/pages/troubleshooting-page.ts
class TroubleshootingPage (line 3) | class TroubleshootingPage {
method constructor (line 9) | constructor(page: Page) {
FILE: e2e/pages/volumes-page.ts
type ActionString (line 5) | type ActionString = 'browse' | 'delete';
constant VOLUME_CELL_TEST_IDS (line 7) | const VOLUME_CELL_TEST_IDS = {
class VolumesPage (line 14) | class VolumesPage {
method constructor (line 22) | constructor(page: Page) {
method getVolumeRow (line 31) | getVolumeRow(volumeName: string) {
method waitForVolumeToAppear (line 35) | async waitForVolumeToAppear(volumeName: string) {
method clickVolumeAction (line 40) | async clickVolumeAction(volumeName: string, action: ActionString) {
method browseVolumeFiles (line 56) | async browseVolumeFiles(volumeName: string) {
method deleteVolume (line 60) | async deleteVolume(volumeName: string) {
method getVolumeCount (line 64) | async getVolumeCount(): Promise<number> {
method waitForTableToLoad (line 69) | async waitForTableToLoad() {
method isVolumePresent (line 73) | async isVolumePresent(volumeName: string): Promise<boolean> {
method searchVolumes (line 78) | async searchVolumes(searchTerm: string) {
method getVolumeInfo (line 82) | getVolumeInfo(volumeName: string) {
method selectBulkVolumes (line 94) | async selectBulkVolumes(volumeNames: string[]) {
method clickBulkDelete (line 104) | async clickBulkDelete() {
method deleteBulkVolumes (line 112) | async deleteBulkVolumes(volumeNames: string[]) {
FILE: e2e/pages/wsl-integrations-page.ts
class CheckboxLocator (line 8) | class CheckboxLocator {
method constructor (line 13) | constructor(locator: Locator) {
method click (line 20) | click(...args: Parameters<Locator['click']>) {
method assertEnabled (line 25) | async assertEnabled(options?:{ timeout?: number }) {
method assertDisabled (line 34) | async assertDisabled(options?:{ timeout?: number }) {
class WSLIntegrationsPage (line 44) | class WSLIntegrationsPage {
method constructor (line 50) | constructor(page: Page) {
method getIntegration (line 57) | getIntegration(distro: string): CheckboxLocator {
FILE: e2e/quit-on-close.e2e.spec.ts
function closeWindowsAndCheckQuit (line 42) | function closeWindowsAndCheckQuit(electronApp: ElectronApplication): Pro...
FILE: e2e/rdctl.e2e.spec.ts
function doRequest (line 60) | async function doRequest(path: string, body = '', method = 'GET') {
function rdctlPath (line 78) | function rdctlPath() {
function rdctl (line 82) | async function rdctl(commandArgs: string[]): Promise< { stdout: string, ...
function rdctlWithStdin (line 92) | async function rdctlWithStdin(inputFile: string, commandArgs: string[]):...
function verifySettingsKeys (line 110) | function verifySettingsKeys(settings: Record<string, any>) {
function getEndpoints (line 1178) | async function getEndpoints() {
FILE: e2e/start-in-background.e2e.spec.ts
function checkWindowOpened (line 30) | function checkWindowOpened(electronApp: ElectronApplication): Promise<bo...
FILE: e2e/startup-profiles.e2e.spec.ts
function createInvalidDarwinUserProfile (line 42) | async function createInvalidDarwinUserProfile(contents: string) {
function createInvalidLinuxUserProfile (line 48) | async function createInvalidLinuxUserProfile(contents: string) {
function addRegistryEntry (line 54) | async function addRegistryEntry(path: string, name: string, valueType: s...
function createDefaultUserRegistryProfileWithNonexistentFields (line 60) | async function createDefaultUserRegistryProfileWithNonexistentFields() {
function createDefaultUserRegistryProfileWithIncorrectTypes (line 71) | async function createDefaultUserRegistryProfileWithIncorrectTypes() {
function createDefaultUserRegistryProfileWithValidDataButNoVersion (line 80) | async function createDefaultUserRegistryProfileWithValidDataButNoVersion...
function createLockedUserRegistryProfileWithValidDataButNoVersion (line 86) | async function createLockedUserRegistryProfileWithValidDataButNoVersion() {
FILE: e2e/utils/ProfileUtils.ts
function clearSettings (line 25) | async function clearSettings(): Promise<void> {
function clearUserProfile (line 31) | async function clearUserProfile(): Promise<void> {
function fileExists (line 44) | async function fileExists(fullPath: string): Promise<boolean> {
function getDeploymentBaseNames (line 54) | function getDeploymentBaseNames(platform: 'linux' | 'darwin'): string[] {
function getDeploymentPaths (line 64) | function getDeploymentPaths(platform: 'linux' | 'darwin', profileDir: st...
function hasSystemRegistrySubtree (line 76) | async function hasSystemRegistrySubtree(): Promise<boolean> {
function verifySystemRegistrySubtree (line 94) | async function verifySystemRegistrySubtree(): Promise<string[]> {
function verifySettings (line 102) | async function verifySettings(): Promise<void> {
function verifyNoRegistrySubtree (line 110) | async function verifyNoRegistrySubtree(hive: string): Promise<void> {
function verifyUserProfile (line 133) | async function verifyUserProfile(): Promise<void> {
function verifyNoSystemProfile (line 138) | async function verifyNoSystemProfile(): Promise<string[]> {
function verifySystemProfile (line 165) | async function verifySystemProfile(): Promise<string[]> {
function testForFirstRunWindow (line 190) | async function testForFirstRunWindow(testInfo: TestInfo, options: startR...
function testForNoFirstRunWindow (line 252) | async function testForNoFirstRunWindow(testInfo: TestInfo, options: star...
function testWaitForLogfile (line 299) | async function testWaitForLogfile(testInfo: TestInfo, options: startRanc...
FILE: e2e/utils/TestUtils.ts
function setUserProfile (line 31) | async function setUserProfile(userProfile: RecursivePartial<Settings> | ...
function setLinuxUserProfile (line 43) | async function setLinuxUserProfile(userProfile: RecursivePartial<Setting...
function convertToRegistryLegacy (line 59) | function convertToRegistryLegacy(s: string) {
function setWindowsUserLegacyProfile (line 64) | async function setWindowsUserLegacyProfile(userProfile: RecursivePartial...
function setDarwinUserProfile (line 99) | async function setDarwinUserProfile(userProfile: RecursivePartial<Settin...
function createDefaultSettings (line 120) | function createDefaultSettings(overrides: RecursivePartial<Settings> = {...
function getAlternateSetting (line 158) | function getAlternateSetting<K extends keyof RecursiveTypes<Settings>>(c...
function reportAsset (line 166) | function reportAsset(testInfo: TestInfo, type: 'trace' | 'log' = 'trace') {
function teardownApp (line 191) | async function teardownApp(app: ElectronApplication) {
function teardown (line 237) | async function teardown(app: ElectronApplication, testInfo: TestInfo) {
function getResourceBinDir (line 256) | function getResourceBinDir(): string {
function getFullPathForTool (line 262) | function getFullPathForTool(tool: string): string {
function tool (line 271) | async function tool(tool: string, ...args: string[]): Promise<string> {
function kubectl (line 304) | async function kubectl(...args: string[] ): Promise<string> {
function helm (line 313) | async function helm(...args: string[] ): Promise<string> {
function retry (line 317) | async function retry<T>(proc: () => Promise<T>, options?: { delay?: numb...
type startRancherDesktopOptions (line 335) | interface startRancherDesktopOptions {
function startRancherDesktop (line 354) | async function startRancherDesktop(testInfo: TestInfo, options: startRan...
function startSlowerDesktop (line 394) | async function startSlowerDesktop(testInfo: TestInfo, defaultSettings: R...
FILE: pkg/rancher-desktop/backend/__tests__/backendHelper.spec.ts
type Options (line 24) | interface Options {
class mockExecutor (line 31) | class mockExecutor implements Partial<VMExecutor> {
method constructor (line 36) | constructor(options: typeof this.options) {
method execCommand (line 43) | execCommand(options?: unknown, ...command: string[]): Promise<void> | ...
method readFile (line 63) | readFile(filePath: string): Promise<string> {
method writeFile (line 73) | writeFile(filePath: string, fileContents: string): Promise<void> {
function runTest (line 83) | async function runTest(options: Options): Promise<boolean> {
function generateCases (line 96) | function generateCases(alwaysUseWASM: boolean) {
FILE: pkg/rancher-desktop/backend/backend.ts
type State (line 12) | enum State {
class BackendError (line 21) | class BackendError extends Error {
method constructor (line 22) | constructor(name: string, message: string, fatal = false) {
type BackendProgress (line 31) | interface BackendProgress {
type Architecture (line 42) | type Architecture = 'x86_64' | 'aarch64';
type FailureDetails (line 44) | interface FailureDetails {
type BackendEvents (line 57) | interface BackendEvents {
type BackendSettings (line 78) | type BackendSettings = RecursiveReadonly<Settings>;
type RestartReasons (line 86) | type RestartReasons = Partial<Record<RecursiveKeys<Settings>, {
type VMBackend (line 107) | interface VMBackend extends EventEmitter<BackendEvents> {
type execOptions (line 190) | type execOptions = childProcess.CommonOptions & {
type VMExecutor (line 205) | interface VMExecutor {
FILE: pkg/rancher-desktop/backend/backendHelper.ts
constant CONTAINERD_CONFIG_TOML (line 24) | const CONTAINERD_CONFIG_TOML = '/etc/containerd/config.toml';
constant DOCKER_DAEMON_JSON (line 25) | const DOCKER_DAEMON_JSON = '/etc/docker/daemon.json';
constant MANIFEST_DIR (line 27) | const MANIFEST_DIR = '/var/lib/rancher/k3s/server/manifests';
constant MANIFEST_RUNTIMES (line 31) | const MANIFEST_RUNTIMES = 'z100-runtimes';
constant MANIFEST_CERT_MANAGER_CRDS (line 32) | const MANIFEST_CERT_MANAGER_CRDS = 'z110-cert-manager.crds';
constant MANIFEST_CERT_MANAGER (line 33) | const MANIFEST_CERT_MANAGER = 'z115-cert-manager';
constant MANIFEST_SPIN_OPERATOR_CRDS (line 34) | const MANIFEST_SPIN_OPERATOR_CRDS = 'z120-spin-operator.crds';
constant MANIFEST_SPIN_OPERATOR (line 35) | const MANIFEST_SPIN_OPERATOR = 'z125-spin-operator';
constant STATIC_DIR (line 37) | const STATIC_DIR = '/var/lib/rancher/k3s/server/static/rancher-desktop';
constant STATIC_CERT_MANAGER_CHART (line 38) | const STATIC_CERT_MANAGER_CHART = `${ STATIC_DIR }/cert-manager.tgz`;
constant STATIC_SPIN_OPERATOR_CHART (line 39) | const STATIC_SPIN_OPERATOR_CHART = `${ STATIC_DIR }/spin-operator.tgz`;
class BackendHelper (line 43) | class BackendHelper {
method ensureDockerAuth (line 51) | static ensureDockerAuth(existingConfig: Record<string, any>): Record<s...
method escapeChar (line 60) | private static escapeChar(_: any, slashes: string, char: string) {
method createAllowedImageListConf (line 71) | static createAllowedImageListConf(allowedImages: BackendSettings['cont...
method requiresCRIDockerd (line 148) | static requiresCRIDockerd(engineName: string, kubeVersion: string | se...
method checkForLockedVersion (line 166) | static checkForLockedVersion(newVersion: semver.SemVer, cfg: BackendSe...
method getDesiredVersion (line 183) | static async getDesiredVersion(cfg: BackendSettings, availableVersions...
method containerdShims (line 269) | static async containerdShims(vmx: VMExecutor): Promise<Record<string, ...
method manifestFilename (line 290) | private static manifestFilename(manifest: string): string {
method configureRuntimeClasses (line 297) | static async configureRuntimeClasses(vmx: VMExecutor) {
method configureSpinOperator (line 322) | static async configureSpinOperator(vmx: VMExecutor) {
method installContainerdShims (line 337) | static async installContainerdShims(vmx: VMExecutor, configureWASM: bo...
method writeContainerdConfig (line 357) | static async writeContainerdConfig(vmx: VMExecutor, configureWASM: boo...
method configureMobyStorage (line 377) | static async configureMobyStorage(vmx: VMExecutor, storageDriver: 'cla...
method configureContainerEngine (line 447) | static async configureContainerEngine(vmx: VMExecutor, configureWASM: ...
FILE: pkg/rancher-desktop/backend/containerClient/auth.ts
type tokenCacheEntry (line 8) | interface tokenCacheEntry {
class RegistryAuth (line 18) | class RegistryAuth {
method findAuth (line 29) | protected async findAuth(...hosts: string[]): Promise<string | undefin...
method basicAuth (line 94) | protected async basicAuth(host: string): Promise<Record<string, string...
method bearerAuth (line 109) | protected async bearerAuth(host: string, parameters: Record<string, st...
method parseAuthHeader (line 188) | protected parseAuthHeader(header: string): { scheme: string, parameter...
method authenticate (line 324) | async authenticate(endpoint: URL): Promise<Headers> {
FILE: pkg/rancher-desktop/backend/containerClient/mobyClient.ts
type runClientOptions (line 27) | type runClientOptions = ContainerRunClientOptions & {
class MobyClient (line 32) | class MobyClient implements ContainerEngineClient {
method constructor (line 33) | constructor(vm: VMExecutor, endpoint: string) {
method runCleanups (line 45) | protected async runCleanups(cleanups: (() => Promise<unknown>)[]) {
method makeContainer (line 55) | protected async makeContainer(imageID: string): Promise<string> {
method waitForReady (line 67) | async waitForReady(): Promise<void> {
method readFile (line 107) | async readFile(imageID: string, filePath: string, options?: { encoding...
method copyFile (line 128) | async copyFile(imageID: string, sourcePath: string, destinationPath: s...
method extractArchive (line 185) | protected async extractArchive(archive: string, destination: string, s...
method getTags (line 365) | async getTags(imageName: string, options?: ContainerBasicOptions) {
method run (line 395) | async run(imageID: string, options?: ContainerRunOptions): Promise<str...
method stop (line 423) | async stop(container: string, options?: ContainerStopOptions): Promise...
method composeUp (line 440) | async composeUp(options: ContainerComposeOptions): Promise<void> {
method composeDown (line 452) | async composeDown(options: ContainerComposeOptions): Promise<void> {
method composeExec (line 462) | composeExec(options: ContainerComposeExecOptions): Promise<ReadablePro...
method composePort (line 475) | async composePort(options: ContainerComposePortOptions): Promise<strin...
method runClient (line 492) | runClient(args: string[], stdio?: 'ignore' | 'pipe' | 'stream' | 'inte...
FILE: pkg/rancher-desktop/backend/containerClient/nerdctlClient.ts
class NerdctlClient (line 29) | class NerdctlClient implements ContainerEngineClient {
method constructor (line 30) | constructor(vm: VMExecutor) {
method nerdctl (line 43) | protected async nerdctl(optionOrArg: any, ...args: string[]): Promise<...
method runCleanups (line 65) | protected async runCleanups(cleanups: (() => Promise<unknown>)[]) {
method execCommandWithRetries (line 82) | protected async execCommandWithRetries(options: execOptions & { captur...
method mountImage (line 102) | protected async mountImage(imageID: string, namespace?: string): Promi...
method waitForReady (line 139) | async waitForReady(): Promise<void> {
method readFile (line 161) | async readFile(imageID: string, filePath: string, options?: { encoding...
method copyFile (line 176) | async copyFile(imageID: string, sourcePath: string, destinationDir: st...
method getTags (line 231) | async getTags(imageName: string, options?: ContainerBasicOptions) {
method run (line 261) | async run(imageID: string, options?: ContainerRunOptions): Promise<str...
method stop (line 276) | async stop(container: string, options?: ContainerStopOptions): Promise...
method copyDirectoryIn (line 302) | protected async copyDirectoryIn(hostPath: string): Promise<string> {
method composePrep (line 392) | protected async composePrep(options: ContainerComposeOptions): Promise<{
method composeUp (line 438) | async composeUp(options: ContainerComposeOptions): Promise<void> {
method composeDown (line 464) | async composeDown(options: ContainerComposeOptions): Promise<void> {
method composeExec (line 484) | async composeExec(options: ContainerComposeExecOptions): Promise<Reada...
method composePort (line 515) | async composePort(options: ContainerComposePortOptions): Promise<strin...
method runClient (line 541) | runClient(args: string[], stdio?: 'ignore' | 'pipe' | 'stream' | 'inte...
FILE: pkg/rancher-desktop/backend/containerClient/registry.ts
class DockerRegistry (line 9) | class DockerRegistry {
method get (line 14) | async get(endpoint: URL): ReturnType<typeof net.fetch> {
method getTags (line 24) | async getTags(name: string): Promise<string[]> {
method authenticate (line 68) | protected authenticate(endpoint: URL): Promise<HeadersInit> {
FILE: pkg/rancher-desktop/backend/containerClient/types.ts
type ContainerBasicOptions (line 6) | interface ContainerBasicOptions {
type ContainerRunOptions (line 18) | type ContainerRunOptions = ContainerBasicOptions & {
type ContainerStopOptions (line 29) | type ContainerStopOptions = ContainerBasicOptions & {
type ContainerComposeOptions (line 41) | type ContainerComposeOptions = ContainerBasicOptions & {
type ContainerComposeExecOptions (line 50) | type ContainerComposeExecOptions = ContainerComposeOptions & {
type ReadableProcess (line 62) | type ReadableProcess = ChildProcessByStdio<null, Readable, Readable>;
type WritableReadableProcess (line 65) | type WritableReadableProcess = ChildProcessByStdio<Writable, Readable, R...
type ContainerComposePortOptions (line 67) | type ContainerComposePortOptions = ContainerComposeOptions & {
type ContainerRunClientOptions (line 80) | type ContainerRunClientOptions = SpawnOptions & { namespace?: string };
type ContainerEngineClient (line 85) | interface ContainerEngineClient {
FILE: pkg/rancher-desktop/backend/factory.ts
function factory (line 12) | function factory(arch: Architecture): VMBackend {
FILE: pkg/rancher-desktop/backend/images/imageFactory.ts
function getImageProcessor (line 12) | function getImageProcessor(engineName: ContainerEngine, executor: VMBack...
FILE: pkg/rancher-desktop/backend/images/imageProcessor.ts
constant REFRESH_INTERVAL (line 11) | const REFRESH_INTERVAL = 5 * 1000;
type childResultType (line 18) | interface childResultType {
type ImageType (line 28) | interface ImageType {
type ProcessChildOutputOptions (line 39) | interface ProcessChildOutputOptions {
method constructor (line 93) | protected constructor(backend: VMBackend) {
method activate (line 142) | activate() {
method deactivate (line 146) | deactivate() {
method updateWatchStatus (line 150) | protected updateWatchStatus() {
method isReady (line 170) | get isReady() {
method runTrivyScan (line 186) | async runTrivyScan(taggedImageName: string, env?: Record<string, string>) {
method listImages (line 211) | listImages(): ImageType[] {
method isChildResultType (line 215) | isChildResultType(object: any): object is childResultType {
method refreshImages (line 225) | async refreshImages() {
method parse (line 259) | protected parse(data: string): ImageType[] {
method processChildOutput (line 282) | async processChildOutput(child: ChildProcess, options: ProcessChildOutpu...
method relayNamespaces (line 379) | async relayNamespaces() {
method namespace (line 389) | get namespace() {
method namespace (line 393) | set namespace(value: string) {
FILE: pkg/rancher-desktop/backend/images/mobyImageProcessor.ts
class MobyImageProcessor (line 12) | class MobyImageProcessor extends imageProcessor.ImageProcessor {
method constructor (line 13) | constructor(backend: VMBackend) {
method processorName (line 25) | protected get processorName() {
method runImagesCommand (line 29) | protected async runImagesCommand(args: string[], sendNotifications = t...
method buildImage (line 42) | async buildImage(dirPart: string, filePart: string, taggedImageName: s...
method deleteImage (line 51) | async deleteImage(imageID: string): Promise<imageProcessor.childResult...
method deleteImages (line 55) | async deleteImages(imageIDs: string[]): Promise<imageProcessor.childRe...
method pullImage (line 59) | async pullImage(taggedImageName: string): Promise<imageProcessor.child...
method pushImage (line 63) | async pushImage(taggedImageName: string): Promise<imageProcessor.child...
method getImages (line 67) | async getImages(): Promise<imageProcessor.childResultType> {
method scanImage (line 73) | scanImage(taggedImageName: string, namespace: string): Promise<imagePr...
method relayNamespaces (line 77) | relayNamespaces(): Promise<void> {
method getNamespaces (line 83) | getNamespaces(): Promise<string[]> {
method parse (line 95) | parse(data: string): imageProcessor.ImageType[] {
function imageComparator (line 128) | function imageComparator(a: imageProcessor.ImageType, b: imageProcessor....
FILE: pkg/rancher-desktop/backend/images/nerdctlImageProcessor.ts
class NerdctlImageProcessor (line 13) | class NerdctlImageProcessor extends imageProcessor.ImageProcessor {
method constructor (line 14) | constructor(backend: VMBackend) {
method processorName (line 26) | protected get processorName() {
method runImagesCommand (line 30) | protected async runImagesCommand(args: string[], sendNotifications = t...
method buildImage (line 43) | async buildImage(dirPart: string, filePart: string, taggedImageName: s...
method deleteImage (line 53) | async deleteImage(imageID: string): Promise<imageProcessor.childResult...
method deleteImages (line 57) | async deleteImages(imageIDs: string[]): Promise<imageProcessor.childRe...
method pullImage (line 61) | async pullImage(taggedImageName: string): Promise<imageProcessor.child...
method pushImage (line 65) | async pushImage(taggedImageName: string): Promise<imageProcessor.child...
method getImages (line 69) | async getImages(): Promise<imageProcessor.childResultType> {
method scanImage (line 75) | scanImage(taggedImageName: string, namespace: string): Promise<imagePr...
method getNamespaces (line 85) | async getNamespaces(): Promise<string[]> {
method parse (line 105) | parse(data: string): imageProcessor.ImageType[] {
function imageComparator (line 137) | function imageComparator(a: imageProcessor.ImageType, b: imageProcessor....
FILE: pkg/rancher-desktop/backend/k3sHelper.ts
type ShortVersion (line 47) | type ShortVersion = string;
type ReleaseAPIEntry (line 55) | interface ReleaseAPIEntry {
class NoCachedK3sVersionsError (line 63) | class NoCachedK3sVersionsError extends Error {
constant CURRENT_CACHE_VERSION (line 66) | const CURRENT_CACHE_VERSION = 2 as const;
type cacheData (line 69) | interface cacheData {
type RequiresRestartSeverityChecker (line 87) | type RequiresRestartSeverityChecker<K extends keyof RecursiveTypes<K8s.B...
type RequiresRestartCheckers (line 97) | type RequiresRestartCheckers = {
type ExtraRequiresReasons (line 106) | type ExtraRequiresReasons = {
class ChannelMapping (line 120) | class ChannelMapping {
method [util.inspect.custom] (line 122) | [util.inspect.custom](depth: number, options: util.InspectOptionsStylize...
function buildVersion (line 136) | function buildVersion(version: semver.SemVer) {
class K3sHelper (line 142) | class K3sHelper extends events.EventEmitter {
method constructor (line 156) | constructor(arch: Architecture) {
method readCache (line 178) | protected async readCache() {
method writeCache (line 228) | protected async writeCache() {
method filenames (line 256) | protected get filenames() {
method processVersion (line 280) | protected processVersion(entry: ReleaseAPIEntry): boolean {
method delayForWaitLimiting (line 352) | protected async delayForWaitLimiting(duration = 1_000): Promise<void> {
method compareChannels (line 361) | protected compareChannels(a: string, b: string) {
method updateCache (line 383) | protected async updateCache(): Promise<void> {
method networkReady (line 516) | networkReady() {
method waitForNetwork (line 523) | protected async waitForNetwork() {
method initialize (line 534) | initialize(): Promise<void> {
method getInstalledK3sVersion (line 562) | static async getInstalledK3sVersion(executor: VMExecutor): Promise<str...
method availableVersions (line 599) | get availableVersions(): Promise<SemanticVersionEntry[]> {
method cachedVersionsOnly (line 609) | static cachedVersionsOnly(): Promise<boolean> {
method filterVersionsAgainstCache (line 613) | static async filterVersionsAgainstCache(fullVersionList: SemanticVersi...
method downloadUrl (line 632) | protected get downloadUrl() {
method selectClosestImage (line 651) | static async selectClosestImage(desiredVersion: semver.SemVer): Promis...
method selectClosestSemVer (line 672) | protected static selectClosestSemVer(desiredVersion: semver.SemVer, k3...
method compareBuildVersions (line 688) | protected static compareBuildVersions(v1: semver.SemVer, v2: semver.Se...
method k3sValue (line 692) | protected static k3sValue(v: semver.SemVer): number {
method keepHighestBuildVersion (line 709) | protected static keepHighestBuildVersion(existingVersions: semver.SemV...
method ensureK3sImages (line 723) | async ensureK3sImages(version: semver.SemVer): Promise<void> {
method waitForServerReady (line 864) | async waitForServerReady(getHost: () => Promise<string | undefined>, p...
method findKubeConfigToUpdate (line 936) | static async findKubeConfigToUpdate(contextName: string): Promise<stri...
method updateKubeconfig (line 972) | async updateKubeconfig(configReader: () => Promise<string>): Promise<v...
method ensureContentsAreYAML (line 1060) | protected ensureContentsAreYAML(contents: string): string {
method deleteKubeState (line 1075) | async deleteKubeState(executor: VMExecutor) {
method uninstallHelmChart (line 1094) | async uninstallHelmChart(client: KubeClient, ownerName: string) {
method getCompatibleKubectlVersion (line 1159) | async getCompatibleKubectlVersion(version: semver.SemVer): Promise<voi...
method requiresRestartReasons (line 1203) | requiresRestartReasons(
type V1HelmChart (line 1297) | interface V1HelmChart {
FILE: pkg/rancher-desktop/backend/k8s.ts
type KubernetesBackendEvents (line 24) | interface KubernetesBackendEvents {
type KubernetesBackend (line 46) | interface KubernetesBackend extends EventEmitter<KubernetesBackendEvents...
type KubernetesBackendPortForwarder (line 123) | interface KubernetesBackendPortForwarder {
FILE: pkg/rancher-desktop/backend/kube/client.ts
type clientError (line 15) | interface clientError {
function isClientError (line 19) | function isClientError(val: any): val is clientError {
class ErrorSuppressingStdin (line 28) | class ErrorSuppressingStdin extends stream.Readable {
method constructor (line 34) | constructor(socket: net.Socket) {
method listener (line 51) | listener(eventName: string, ...args: any[]) {
method _read (line 61) | _read(size: number): void {
method read (line 65) | read(size?: number): any {
class ForwardingMap (line 74) | class ForwardingMap {
method get (line 82) | get(namespace: string | undefined, endpoint: string, port: number | st...
method set (line 93) | set(namespace: string | undefined, endpoint: string, port: number | st...
method delete (line 103) | delete(namespace: string | undefined, endpoint: string, port: number |...
method has (line 113) | has(namespace: string | undefined, endpoint: string, port: number | st...
method [Symbol.iterator] (line 120) | * [Symbol.iterator](): IterableIterator<[string, string, number | string...
class WrappedWatch (line 140) | class WrappedWatch extends k8s.Watch {
method constructor (line 143) | constructor(kubeconfig: k8s.KubeConfig, callback: () => void) {
method watch (line 148) | watch(
type ServiceEntry (line 164) | interface ServiceEntry {
class KubeClient (line 182) | class KubeClient extends events.EventEmitter {
method constructor (line 211) | constructor() {
method k8sClient (line 221) | get k8sClient() {
method waitForServiceWatcher (line 228) | async waitForServiceWatcher() {
method getServiceListWatch (line 251) | async getServiceListWatch() {
method waitForReadyNodes (line 286) | async waitForReadyNodes(): Promise<void> {
method destroy (line 301) | destroy() {
method getEndpointSubsets (line 310) | protected async getEndpointSubsets(namespace: string, endpointName: st...
method getActivePodFromEndpointSubsets (line 334) | protected async getActivePodFromEndpointSubsets(subsets: k8s.V1Endpoin...
method getActivePod (line 362) | async getActivePod(namespace: string, endpointName: string): Promise<k...
method getPodDetails (line 402) | protected getPodDetails(pod: k8s.V1Pod, k8sPort: number | string): [st...
method createForwardingServer (line 440) | protected async createForwardingServer(namespace: string, endpoint: st...
method forwardPort (line 530) | async forwardPort(namespace: string, endpoint: string, k8sPort: number...
method closeServerAndConns (line 605) | protected async closeServerAndConns(namespace: string, endpoint: strin...
method cancelForwardPort (line 628) | async cancelForwardPort(namespace: string, endpoint: string, k8sPort: ...
method listServices (line 638) | listServices(namespace: string | undefined = undefined): ServiceEntry[] {
FILE: pkg/rancher-desktop/backend/kube/lima.ts
class LimaKubernetesBackend (line 34) | class LimaKubernetesBackend extends events.EventEmitter implements K8s.K...
method constructor (line 35) | constructor(arch: Architecture, vm: LimaBackend) {
method download (line 56) | async download(cfg: BackendSettings): Promise<[semver.SemVer | undefin...
method install (line 137) | async install(config: BackendSettings, desiredVersion: semver.SemVer, ...
method start (line 167) | async start(config_: BackendSettings, kubernetesVersion: semver.SemVer...
method stop (line 269) | async stop() {
method cleanup (line 282) | cleanup(): Promise<void> {
method reset (line 288) | async reset() {
method progressTracker (line 306) | protected get progressTracker() {
method version (line 310) | get version(): ShortVersion {
method availableVersions (line 314) | get availableVersions(): Promise<SemanticVersionEntry[]> {
method cachedVersionsOnly (line 318) | async cachedVersionsOnly(): Promise<boolean> {
method desiredPort (line 322) | get desiredPort() {
method desiredVersion (line 326) | protected get desiredVersion(): Promise<semver.SemVer | undefined> {
method installK3s (line 358) | protected async installK3s(version: semver.SemVer) {
method writeServiceScript (line 370) | protected async writeServiceScript(cfg: BackendSettings, desiredVersio...
method deleteIncompatibleData (line 410) | async deleteIncompatibleData(desiredVersion: semver.SemVer) {
method requiresRestartReasons (line 424) | async requiresRestartReasons(currentConfig: BackendSettings, desiredCo...
method listServices (line 438) | listServices(namespace?: string): K8s.ServiceEntry[] {
method forwardPort (line 442) | async forwardPort(namespace: string, service: string, k8sPort: number ...
method cancelForward (line 446) | async cancelForward(namespace: string, service: string, k8sPort: numbe...
method eventNames (line 451) | eventNames(): (keyof K8s.KubernetesBackendEvents)[] {
method listeners (line 455) | listeners<eventName extends keyof K8s.KubernetesBackendEvents>(
method rawListeners (line 461) | rawListeners<eventName extends keyof K8s.KubernetesBackendEvents>(
FILE: pkg/rancher-desktop/backend/kube/wsl.ts
class WSLKubernetesBackend (line 28) | class WSLKubernetesBackend extends events.EventEmitter implements K8s.Ku...
method constructor (line 29) | constructor(vm: WSLBackend) {
method progressTracker (line 54) | get progressTracker() {
method downloadURL (line 58) | protected get downloadURL() {
method version (line 62) | get version(): ShortVersion {
method port (line 66) | get port(): number {
method availableVersions (line 70) | get availableVersions(): Promise<SemanticVersionEntry[]> {
method cachedVersionsOnly (line 74) | async cachedVersionsOnly(): Promise<boolean> {
method desiredVersion (line 78) | protected get desiredVersion(): Promise<semver.SemVer | undefined> {
method deleteIncompatibleData (line 106) | async deleteIncompatibleData(desiredVersion: semver.SemVer) {
method desiredPort (line 121) | get desiredPort() {
method download (line 130) | async download(cfg: BackendSettings): Promise<[semver.SemVer | undefin...
method install (line 198) | async install(config: BackendSettings, version: semver.SemVer, allowSu...
method start (line 213) | async start(config: BackendSettings, activeVersion: semver.SemVer, kub...
method stop (line 317) | async stop() {
method cleanup (line 322) | cleanup() {
method reset (line 328) | async reset() {
method requiresRestartReasons (line 332) | requiresRestartReasons(oldConfig: BackendSettings, newConfig: Recursiv...
method listServices (line 344) | listServices(namespace?: string): K8s.ServiceEntry[] {
method forwardPort (line 348) | async forwardPort(namespace: string, service: string, k8sPort: number ...
method cancelForward (line 352) | async cancelForward(namespace: string, service: string, k8sPort: numbe...
method eventNames (line 357) | eventNames(): (keyof K8s.KubernetesBackendEvents)[] {
method listeners (line 361) | listeners<eventName extends keyof K8s.KubernetesBackendEvents>(
method rawListeners (line 367) | rawListeners<eventName extends keyof K8s.KubernetesBackendEvents>(
FILE: pkg/rancher-desktop/backend/kubeconfig.ts
type Cluster (line 23) | interface Cluster {
function loadFromString (line 33) | function loadFromString(kubeConfig : KubeConfig, config: string, opts?: ...
function newClusters (line 42) | function newClusters(a: any, opts?: Partial<ConfigOptions>): Cluster[] {
function exportCluster (line 48) | function exportCluster(cluster: Cluster): any {
function clusterIterator (line 62) | function clusterIterator(onInvalidEntry: ActionOnInvalid): _.ListIterato...
function exportConfig (line 96) | function exportConfig(config : KubeConfig): string {
function getKubeConfigPaths (line 114) | async function getKubeConfigPaths(): Promise<string[]> {
function setCurrentContext (line 146) | function setCurrentContext(ctx: string, exitfunc: (code: number | null, ...
FILE: pkg/rancher-desktop/backend/lima.ts
type Action (line 68) | enum Action {
type SLIRP (line 77) | enum SLIRP {
type LimaMount (line 86) | interface LimaMount {
type LimaConfiguration (line 100) | interface LimaConfiguration {
type ImageFormat (line 152) | enum ImageFormat {
type QEMUImageInfo (line 160) | interface QEMUImageInfo {
type SpawnOptions (line 167) | interface SpawnOptions {
type LimaNetworkConfiguration (line 177) | interface LimaNetworkConfiguration {
type LimaListResult (line 198) | interface LimaListResult {
type SPNetworkDataType (line 211) | interface SPNetworkDataType {
type SudoReason (line 220) | type SudoReason = 'networking' | 'docker-socket';
type SudoCommand (line 227) | interface SudoCommand {
constant DEFAULT_DOCKER_SOCK_LOCATION (line 237) | const DEFAULT_DOCKER_SOCK_LOCATION = '/var/run/docker.sock';
constant MACHINE_NAME (line 239) | const MACHINE_NAME = '0';
constant IMAGE_VERSION (line 240) | const IMAGE_VERSION = DEPENDENCY_VERSIONS.alpineLimaISO.isoVersion;
constant ALPINE_EDITION (line 241) | const ALPINE_EDITION = 'rd';
constant ALPINE_VERSION (line 242) | const ALPINE_VERSION = DEPENDENCY_VERSIONS.alpineLimaISO.alpineVersion;
constant ETC_RANCHER_DESKTOP_DIR (line 244) | const ETC_RANCHER_DESKTOP_DIR = '/etc/rancher/desktop';
constant CREDENTIAL_FORWARDER_SETTINGS_PATH (line 245) | const CREDENTIAL_FORWARDER_SETTINGS_PATH = path.join(ETC_RANCHER_DESKTOP...
constant DOCKER_CREDENTIAL_PATH (line 246) | const DOCKER_CREDENTIAL_PATH = '/usr/local/bin/docker-credential-rancher...
constant ROOT_DOCKER_CONFIG_DIR (line 247) | const ROOT_DOCKER_CONFIG_DIR = '/root/.docker';
constant ROOT_DOCKER_CONFIG_PATH (line 248) | const ROOT_DOCKER_CONFIG_PATH = path.join(ROOT_DOCKER_CONFIG_DIR, 'confi...
constant VMNET_DIR (line 253) | const VMNET_DIR = '/opt/rancher-desktop';
constant LIMA_SUDOERS_LOCATION (line 258) | const LIMA_SUDOERS_LOCATION = '/private/etc/sudoers.d/zzzzz-rancher-desk...
constant PREVIOUS_LIMA_SUDOERS_LOCATION (line 260) | const PREVIOUS_LIMA_SUDOERS_LOCATION = '/private/etc/sudoers.d/rancher-d...
class LimaBackend (line 274) | class LimaBackend extends events.EventEmitter implements VMBackend, VMEx...
method constructor (line 275) | constructor(arch: Architecture, kubeFactory: (backend: LimaBackend) =>...
method containerEngineClient (line 297) | get containerEngineClient() {
method noModalDialogs (line 322) | get noModalDialogs() {
method noModalDialogs (line 326) | set noModalDialogs(value: boolean) {
method writeSetting (line 339) | writeSetting(changed: RecursivePartial<BackendSettings>) {
method state (line 347) | get state() {
method setState (line 351) | protected async setState(state: State) {
method backend (line 373) | get backend(): 'lima' {
method cpus (line 377) | get cpus(): Promise<number> {
method memory (line 383) | get memory(): Promise<number> {
method ensureArchitectureMatch (line 389) | protected ensureArchitectureMatch() {
method ensureVirtualizationSupported (line 401) | protected async ensureVirtualizationSupported() {
method ipAddress (line 427) | get ipAddress(): Promise<string | undefined> {
method getBackendInvalidReason (line 431) | getBackendInvalidReason(): Promise<BackendError | null> {
method updateBaseDisk (line 443) | protected async updateBaseDisk(currentConfig: LimaConfiguration) {
method baseDiskImage (line 537) | protected get baseDiskImage() {
method sshPort (line 544) | get sshPort(): Promise<number> {
method getMounts (line 572) | protected getMounts(): LimaMount[] {
method updateConfig (line 617) | protected async updateConfig(allowRoot = true) {
method updateConfigPortForwards (line 715) | protected updateConfigPortForwards(config: LimaConfiguration) {
method getLimaConfig (line 737) | protected async getLimaConfig(): Promise<LimaConfiguration | undefined> {
method limactl (line 750) | protected static get limactl() {
method qemuImg (line 754) | protected static get qemuImg() {
method limaEnv (line 758) | protected static get limaEnv() {
method qemuImgEnv (line 784) | protected static get qemuImgEnv() {
method lima (line 793) | async lima(this: Readonly<this>, envOrArg: NodeJS.ProcessEnv | string,...
method limaWithCapture (line 819) | protected async limaWithCapture(this: Readonly<this>, argOrOptions: st...
method spawnWithCapture (line 835) | async spawnWithCapture(this: Readonly<this>, cmd: string, argOrOptions...
method limaSpawn (line 869) | limaSpawn(options: execOptions, args: string[]): ChildProcess {
method execCommand (line 891) | async execCommand(optionsOrArg: execOptions | string, ...command: stri...
method spawn (line 929) | spawn(optionsOrCommand: string | execOptions, ...command: string[]): C...
method status (line 946) | protected get status(): Promise<LimaListResult | undefined> {
method imageInfo (line 962) | protected async imageInfo(fileName: string): Promise<QEMUImageInfo> {
method convertToRaw (line 973) | protected async convertToRaw(fileName: string): Promise<void> {
method isRegistered (line 982) | protected get isRegistered(): Promise<boolean> {
method calcRandomTag (line 986) | private static calcRandomTag(desiredLength: number) {
method showSudoReason (line 997) | protected async showSudoReason(this: Readonly<this> & this, explanatio...
method installToolsWithSudo (line 1020) | protected async installToolsWithSudo(): Promise<boolean> {
method installVMNETTools (line 1092) | protected async installVMNETTools(this: unknown): Promise<SudoCommand ...
method sudoersFile (line 1232) | protected sudoersFile(config: LimaNetworkConfiguration): string {
method createLimaSudoersFile (line 1282) | protected async createLimaSudoersFile(this: Readonly<this> & this, ran...
method ensureRunLimaLocation (line 1331) | protected async ensureRunLimaLocation(this: unknown): Promise<SudoComm...
method configureDockerSocket (line 1364) | protected async configureDockerSocket(this: Readonly<this> & this): Pr...
method evalSymlink (line 1382) | protected async evalSymlink(this: Readonly<this>, path: string): Promi...
method sudoRequiresPassword (line 1402) | protected async sudoRequiresPassword() {
method sudoExec (line 1421) | protected async sudoExec(this: unknown, command: string) {
method installCustomLimaNetworkConfig (line 1445) | protected async installCustomLimaNetworkConfig(allowRoot = true): Prom...
method getDarwinHostNetworks (line 1514) | protected async getDarwinHostNetworks(): Promise<SPNetworkDataType[]> {
method configureContainerEngine (line 1522) | protected async configureContainerEngine(): Promise<void> {
method configureLogrotate (line 1553) | protected async configureLogrotate(): Promise<void> {
method readFile (line 1557) | async readFile(filePath: string, options?: { encoding?: BufferEncoding...
method writeFile (line 1602) | async writeFile(filePath: string, fileContents: string, permissions: f...
method copyFileIn (line 1619) | async copyFileIn(hostPath: string, vmPath: string): Promise<void> {
method copyFileOut (line 1634) | copyFileOut(vmPath: string, hostPath: string): Promise<void> {
method getInterfaceAddr (line 1641) | async getInterfaceAddr(iface: string) {
method getListeningInterface (line 1659) | async getListeningInterface(allowSudo: boolean) {
method noBridgedNetworkDialog (line 1697) | protected noBridgedNetworkDialog(sharedIP: string) {
method writeBuildkitScripts (line 1713) | protected async writeBuildkitScripts() {
method getResolver (line 1718) | protected async getResolver() {
method configureOpenResty (line 1733) | protected async configureOpenResty(config: BackendSettings) {
method writeConf (line 1757) | async writeConf(service: string, settings: Record<string, string>) {
method installTrivy (line 1763) | protected async installTrivy() {
method startVM (line 1775) | protected async startVM() {
method start (line 1816) | async start(config_: BackendSettings): Promise<void> {
method startService (line 1993) | protected async startService(serviceName: string) {
method installCACerts (line 1999) | protected async installCACerts(): Promise<void> {
method installCredentialHelper (line 2044) | protected async installCredentialHelper() {
method stop (line 2078) | async stop(): Promise<void> {
method del (line 2134) | async del(): Promise<void> {
method reset (line 2150) | async reset(config: BackendSettings): Promise<void> {
method handleSettingsUpdate (line 2160) | async handleSettingsUpdate(_: BackendSettings): Promise<void> {}
method requiresRestartReasons (line 2162) | async requiresRestartReasons(cfg: RecursivePartial<BackendSettings>): ...
method getFailureDetails (line 2191) | async getFailureDetails(exception: any): Promise<FailureDetails> {
method eventNames (line 2203) | eventNames(): (keyof BackendEvents)[] {
method listeners (line 2207) | listeners<eventName extends keyof BackendEvents>(
method rawListeners (line 2213) | rawListeners<eventName extends keyof BackendEvents>(
FILE: pkg/rancher-desktop/backend/mock.ts
class MockBackend (line 34) | class MockBackend extends events.EventEmitter implements VMExecutor {
method getBackendInvalidReason (line 52) | getBackendInvalidReason(): Promise<KubernetesError | null> {
method setState (line 56) | protected setState(state: State) {
method start (line 61) | async start(config: Settings): Promise<void> {
method stop (line 78) | async stop(): Promise<void> {
method del (line 87) | async del(): Promise<void> {
method reset (line 92) | reset(config: Settings): Promise<void> {
method getFailureDetails (line 98) | getFailureDetails() {
method handleSettingsUpdate (line 109) | async handleSettingsUpdate(_: BackendSettings): Promise<void> {}
method requiresRestartReasons (line 111) | requiresRestartReasons(config: RecursivePartial<BackendSettings>): Pro...
method listIntegrations (line 119) | listIntegrations(): Promise<Record<string, string | boolean>> {
method execCommand (line 135) | execCommand(optionsOrArg: execOptions | string, ...command: string[]):...
method spawn (line 148) | spawn(optionsOrCommand: string | execOptions, ...command: string[]): C...
method readFile (line 152) | readFile(filePath: string, options: { encoding?: BufferEncoding } = {}...
method writeFile (line 156) | writeFile(filePath: string, fileContents: string, permissions: fs.Mode...
method copyFileIn (line 160) | copyFileIn(hostPath: string, vmPath: string): Promise<void> {
method copyFileOut (line 164) | copyFileOut(vmPath: string, hostPath: string): Promise<void> {
method eventNames (line 171) | eventNames(): (keyof BackendEvents)[] {
method listeners (line 175) | listeners<eventName extends keyof BackendEvents>(
method rawListeners (line 181) | rawListeners<eventName extends keyof BackendEvents>(
class MockKubernetesBackend (line 189) | class MockKubernetesBackend extends events.EventEmitter implements Kuber...
method cachedVersionsOnly (line 196) | cachedVersionsOnly(): Promise<boolean> {
method listServices (line 200) | listServices() {
method forwardPort (line 204) | forwardPort(namespace: string, service: string, k8sPort: number | stri...
method cancelForward (line 208) | cancelForward(namespace: string, service: string, k8sPort: number | st...
method download (line 212) | download() {
method deleteIncompatibleData (line 216) | deleteIncompatibleData() {
method install (line 220) | install() {
method start (line 224) | start() {
method stop (line 228) | stop() {
method cleanup (line 232) | cleanup() {
method reset (line 236) | reset() {
method requiresRestartReasons (line 240) | requiresRestartReasons() {
method eventNames (line 245) | eventNames(): (keyof KubernetesBackendEvents)[] {
method listeners (line 249) | listeners<eventName extends keyof KubernetesBackendEvents>(
method rawListeners (line 255) | rawListeners<eventName extends keyof KubernetesBackendEvents>(
class MockContainerEngineClient (line 263) | class MockContainerEngineClient implements ContainerEngineClient {
method waitForReady (line 264) | waitForReady(): Promise<void> {
method readFile (line 268) | readFile(imageID: string, filePath: string, options?: { encoding?: Buf...
method copyFile (line 272) | copyFile(imageID: string, sourcePath: string, destinationDir: string, ...
method getTags (line 276) | getTags(imageName: string, options?: ContainerBasicOptions): Promise<S...
method run (line 280) | run(imageID: string, options?: ContainerRunOptions): Promise<string> {
method stop (line 284) | stop(container: string, options?: ContainerStopOptions): Promise<void> {
method composeUp (line 288) | composeUp(options: ContainerComposeOptions): Promise<void> {
method composeDown (line 292) | composeDown(options?: ContainerComposeOptions): Promise<void> {
method composeExec (line 296) | composeExec(options: ContainerComposeExecOptions): Promise<ReadablePro...
method composePort (line 300) | composePort(options: ContainerComposePortOptions): Promise<string> {
method runClient (line 309) | runClient(args: string[], stdio?: unknown, options?: ContainerRunClien...
FILE: pkg/rancher-desktop/backend/mock_screenshots.ts
class LimaKubernetesBackendMock (line 8) | class LimaKubernetesBackendMock extends LimaKubernetesBackend {
method start (line 9) | start(config_: BackendSettings, kubernetesVersion: semver.SemVer): Pro...
class WSLKubernetesBackendMock (line 14) | class WSLKubernetesBackendMock extends WSLKubernetesBackend {
method start (line 15) | start(config_: BackendSettings, kubernetesVersion: semver.SemVer): Pro...
class KubeClientMock (line 20) | class KubeClientMock extends KubeClient {
method listServices (line 21) | listServices(namespace: string | undefined = undefined): ServiceEntry[] {
FILE: pkg/rancher-desktop/backend/progressTracker.ts
function getProgressErrorDescription (line 7) | function getProgressErrorDescription(e: any) {
class ProgressTracker (line 22) | class ProgressTracker {
method constructor (line 26) | constructor(notify: (progress: BackendProgress) => void, log?: Log) {
method numeric (line 69) | numeric(description: string, current: number, max: number) {
method action (line 88) | action<T>(description: string, priority: number, v: Promise<T> | (() =...
method update (line 131) | protected update() {
FILE: pkg/rancher-desktop/backend/steve.ts
constant STEVE_PORT (line 11) | const STEVE_PORT = 9443;
class Steve (line 18) | class Steve {
method constructor (line 24) | private constructor() {
method getInstance (line 32) | public static getInstance(): Steve {
method start (line 44) | public async start() {
method waitForReady (line 117) | private async waitForReady(): Promise<void> {
method isPortReady (line 141) | private isPortReady(): Promise<boolean> {
method stop (line 165) | public stop() {
FILE: pkg/rancher-desktop/backend/wsl.ts
constant INSTANCE_NAME (line 67) | const INSTANCE_NAME = 'rancher-desktop';
constant DATA_INSTANCE_NAME (line 68) | const DATA_INSTANCE_NAME = 'rancher-desktop-data';
constant ETC_RANCHER_DESKTOP_DIR (line 70) | const ETC_RANCHER_DESKTOP_DIR = '/etc/rancher/desktop';
constant CREDENTIAL_FORWARDER_SETTINGS_PATH (line 71) | const CREDENTIAL_FORWARDER_SETTINGS_PATH = `${ ETC_RANCHER_DESKTOP_DIR }...
constant DOCKER_CREDENTIAL_PATH (line 72) | const DOCKER_CREDENTIAL_PATH = '/usr/local/bin/docker-credential-rancher...
constant ROOT_DOCKER_CONFIG_DIR (line 73) | const ROOT_DOCKER_CONFIG_DIR = '/root/.docker';
constant ROOT_DOCKER_CONFIG_PATH (line 74) | const ROOT_DOCKER_CONFIG_PATH = `${ ROOT_DOCKER_CONFIG_DIR }/config.json`;
constant WSL_PATH_CONVERT_RETRIES (line 76) | const WSL_PATH_CONVERT_RETRIES = 10;
type Action (line 81) | enum Action {
constant DISTRO_VERSION (line 88) | const DISTRO_VERSION = DEPENDENCY_VERSIONS.WSLDistro;
constant DISTRO_DATA_DIRS (line 94) | const DISTRO_DATA_DIRS = [
type wslExecOptions (line 99) | type wslExecOptions = execOptions & {
class WSLBackend (line 106) | class WSLBackend extends events.EventEmitter implements VMBackend, VMExe...
method constructor (line 107) | constructor(kubeFactory: (backend: WSLBackend) => KubernetesBackend) {
method distroFile (line 139) | protected get distroFile() {
method getIsAdminInstall (line 149) | protected getIsAdminInstall(): Promise<boolean> {
method containerEngineClient (line 194) | get containerEngineClient() {
method noModalDialogs (line 205) | get noModalDialogs() {
method noModalDialogs (line 209) | set noModalDialogs(value: boolean) {
method backend (line 222) | get backend(): 'wsl' {
method writeSetting (line 226) | writeSetting(changed: RecursivePartial<BackendSettings>) {
method state (line 235) | get state() {
method setState (line 239) | protected async setState(state: State) {
method cpus (line 259) | get cpus(): Promise<number> {
method memory (line 264) | get memory(): Promise<number> {
method registeredDistros (line 272) | protected async registeredDistros({ runningOnly = false } = {}): Promi...
method isDistroRegistered (line 301) | protected async isDistroRegistered({ distribution = INSTANCE_NAME, run...
method getDistroVersion (line 309) | protected async getDistroVersion(): Promise<string> {
method ensureDistroRegistered (line 321) | protected async ensureDistroRegistered(): Promise<void> {
method initDataDistribution (line 348) | protected async initDataDistribution() {
method runWslProxy (line 452) | protected async runWslProxy() {
method writeHostsFile (line 468) | protected async writeHostsFile(config: BackendSettings) {
method mountData (line 496) | protected async mountData(): Promise<childProcess.ChildProcess> {
method wslify (line 567) | async wslify(windowsPath: string, distro?: string): Promise<string> {
method killStaleProcesses (line 581) | protected async killStaleProcesses() {
method wslInstall (line 593) | protected async wslInstall(windowsPath: string, targetDirectory: strin...
method readFile (line 619) | async readFile(filePath: string, options?: Partial<{
method writeFileWSL (line 652) | async writeFileWSL(filePath: string, fileContents: string, options?: P...
method writeFile (line 675) | async writeFile(filePath: string, fileContents: string, permissions: f...
method copyFileIn (line 679) | async copyFileIn(hostPath: string, vmPath: string): Promise<void> {
method copyFileOut (line 685) | async copyFileOut(vmPath: string, hostPath: string): Promise<void> {
method runInstallScript (line 697) | async runInstallScript(scriptContents: string, scriptName: string, ......
method installWSLHelpers (line 715) | protected async installWSLHelpers() {
method installCredentialHelper (line 722) | protected async installCredentialHelper() {
method getMoproxyPath (line 760) | protected getMoproxyPath(): Promise<string> {
method writeProxySettings (line 764) | protected async writeProxySettings(proxy: BackendSettings['experimenta...
method handleUpgrade (line 786) | protected async handleUpgrade(files: string[]) {
method installGuestAgent (line 797) | protected async installGuestAgent(kubeVersion: semver.SemVer | undefin...
method debugArg (line 822) | protected debugArg(...args: string[]): string[] {
method execWSL (line 833) | protected async execWSL(optionsOrArg: wslExecOptions | string, ...args...
method execCommand (line 880) | async execCommand(optionsOrArg: wslExecOptions | string, ...command: s...
method spawn (line 912) | spawn(optionsOrCommand: execOptions | string, ...command: string[]): c...
method captureCommand (line 938) | protected async captureCommand(optionsOrArg: wslExecOptions | string, ...
method ipAddress (line 955) | get ipAddress(): Promise<string | undefined> {
method getBackendInvalidReason (line 988) | async getBackendInvalidReason(): Promise<BackendError | null> {
method upgradeDistroAsNeeded (line 1020) | protected async upgradeDistroAsNeeded() {
method runInit (line 1045) | protected async runInit() {
method writeConf (line 1123) | protected async writeConf(service: string, settings: Record<string, st...
method readConf (line 1133) | protected async readConf(service: string): Promise<Record<string, stri...
method modifyConf (line 1157) | protected async modifyConf(service: string, settings: Record<string, s...
method execService (line 1171) | async execService(service: string, action: string, argument = '') {
method startService (line 1181) | async startService(service: string) {
method stopService (line 1191) | async stopService(service: string) {
method verifyReady (line 1199) | async verifyReady(...command: string[]) {
method start (line 1221) | async start(config_: BackendSettings): Promise<void> {
method installCACerts (line 1502) | protected async installCACerts(): Promise<void> {
method runProvisioningScripts (line 1546) | protected async runProvisioningScripts() {
method stop (line 1597) | async stop(): Promise<void> {
method del (line 1660) | async del(): Promise<void> {
method reset (line 1673) | async reset(config: BackendSettings): Promise<void> {
method handleSettingsUpdate (line 1688) | async handleSettingsUpdate(newConfig: BackendSettings): Promise<void> {
method requiresRestartReasons (line 1705) | requiresRestartReasons(cfg: RecursivePartial<BackendSettings>): Promis...
method getWSLHelperPath (line 1718) | getWSLHelperPath(distro?: string): Promise<string> {
method getFailureDetails (line 1725) | async getFailureDetails(exception: any): Promise<FailureDetails> {
method eventNames (line 1736) | eventNames(): (keyof BackendEvents)[] {
method listeners (line 1740) | listeners<eventName extends keyof BackendEvents>(
method rawListeners (line 1746) | rawListeners<eventName extends keyof BackendEvents>(
FILE: pkg/rancher-desktop/components/SortableTable/actions.js
method data (line 8) | data() {
method beforeUnmount (line 21) | beforeUnmount() {
method mounted (line 25) | mounted() {
method selectedRows (line 31) | selectedRows() {
method keyedAvailableActions (line 34) | keyedAvailableActions() {
method availableActions (line 40) | availableActions() {
method keyedAvailableActions (line 44) | keyedAvailableActions() {
method selectedRowsText (line 48) | selectedRowsText() {
method actionTooltip (line 57) | actionTooltip() {
method onWindowResize (line 76) | onWindowResize() {
method protectedUpdateHiddenBulkActions (line 84) | protectedUpdateHiddenBulkActions() {
FILE: pkg/rancher-desktop/components/SortableTable/advanced-filtering.js
constant DEFAULT_ADV_FILTER_COLS_VALUE (line 3) | const DEFAULT_ADV_FILTER_COLS_VALUE = ADV_FILTER_ALL_COLS_VALUE;
method data (line 45) | data() {
method mounted (line 58) | mounted() {
method advancedFilteringValues (line 66) | advancedFilteringValues() {
method advancedFilteringVisibility (line 70) | advancedFilteringVisibility(neu) {
method advFilterSelectOptions (line 85) | advFilterSelectOptions() {
method advGroupOptions (line 89) | advGroupOptions() {
method handleColsVisibilityAndFiltering (line 100) | handleColsVisibilityAndFiltering(cols) {
method setColsOptions (line 119) | setColsOptions() {
method addAdvancedFilter (line 221) | addAdvancedFilter() {
method clearAllAdvancedFilters (line 238) | clearAllAdvancedFilters() {
method clearAdvancedFilter (line 247) | clearAdvancedFilter(index) {
method onClickOutside (line 251) | onClickOutside(event) {
method updateColsOptions (line 259) | updateColsOptions() {
method changeColVisibility (line 264) | changeColVisibility(colData) {
FILE: pkg/rancher-desktop/components/SortableTable/debug.js
method sortFields (line 8) | sortFields(neu, old) {
method descending (line 14) | descending(neu, old) {
method rows (line 20) | rows(neu, old) {
method pagingDisplay (line 42) | pagingDisplay(neu, old) {
method totalPages (line 48) | totalPages(neu, old) {
method pagedRows (line 54) | pagedRows(neu, old) {
method arrangedRows (line 60) | arrangedRows(neu, old) {
method searchFields (line 66) | searchFields(neu, old) {
method filteredRows (line 72) | filteredRows(neu, old) {
method groupedRows (line 78) | groupedRows(neu, old) {
method headers (line 84) | headers(neu, old) {
method displayRows (line 90) | displayRows(neu, old) {
method groupBy (line 96) | groupBy(neu, old) {
method groupSort (line 102) | groupSort(neu, old) {
method columns (line 108) | columns(neu, old) {
FILE: pkg/rancher-desktop/components/SortableTable/filtering.js
constant ADV_FILTER_ALL_COLS_VALUE (line 4) | const ADV_FILTER_ALL_COLS_VALUE = 'allcols';
constant ADV_FILTER_ALL_COLS_LABEL (line 5) | const ADV_FILTER_ALL_COLS_LABEL = 'All Columns';
constant LABEL_IDENTIFIER (line 6) | const LABEL_IDENTIFIER = ':::islabel';
method data (line 9) | data() {
method searchFields (line 18) | searchFields() {
method filteredRows (line 35) | filteredRows() {
method handleAdvancedFiltering (line 50) | handleAdvancedFiltering() {
method handleFiltering (line 102) | handleFiltering() {
method arrangedRows (line 172) | arrangedRows(q) {
method searchQuery (line 177) | searchQuery() {
function columnsToSearchField (line 183) | function columnsToSearchField(columns) {
function handleStringSearch (line 208) | function handleStringSearch(searchFields, searchTokens, row) {
function matches (line 226) | function matches(fields, token, item) {
FILE: pkg/rancher-desktop/components/SortableTable/grouping.js
method selectedGroupOption (line 8) | selectedGroupOption() {
method groupedRows (line 12) | groupedRows() {
FILE: pkg/rancher-desktop/components/SortableTable/paging.js
method totalRows (line 5) | totalRows() {
method indexFrom (line 13) | indexFrom() {
method indexTo (line 17) | indexTo() {
method totalPages (line 21) | totalPages() {
method showPaging (line 25) | showPaging() {
method pagingDisplay (line 39) | pagingDisplay() {
method pagedRows (line 52) | pagedRows() {
method data (line 63) | data() {
method pagedRows (line 70) | pagedRows() {
method page (line 81) | page() {
method perPage (line 85) | perPage() {
method getPerPage (line 92) | getPerPage() {
method setPage (line 108) | setPage(num) {
method goToPage (line 116) | goToPage(which) {
method getPageByRow (line 137) | getPageByRow(rowId, getRowId = (x) => x) {
FILE: pkg/rancher-desktop/components/SortableTable/selection.js
constant ALL (line 6) | const ALL = 'all';
constant SOME (line 7) | const SOME = 'some';
constant NONE (line 8) | const NONE = 'none';
method mounted (line 11) | mounted() {
method beforeUnmount (line 23) | beforeUnmount() {
method howMuchSelected (line 33) | howMuchSelected() {
method bulkActionsForSelection (line 47) | bulkActionsForSelection() {
method data (line 113) | data() {
method pagedRows (line 123) | pagedRows() {
method onToggleAll (line 141) | onToggleAll(value) {
method onRowMousedown (line 153) | onRowMousedown(e) {
method onRowMouseEnter (line 159) | onRowMouseEnter(e) {
method onRowMouseLeave (line 169) | onRowMouseLeave(e) {
method nodeForEvent (line 179) | nodeForEvent(e) {
method nodeForRow (line 203) | nodeForRow(tgtRow) {
method onRowClick (line 227) | async onRowClick(e) {
method onRowContext (line 309) | async onRowContext(e) {
method keySelectRow (line 342) | keySelectRow(row, more = false) {
method isSelectionCheckbox (line 359) | isSelectionCheckbox(element) {
method nodesBetween (line 365) | nodesBetween(a, b) {
method groupIdx (line 410) | groupIdx(node) {
method toggle (line 429) | toggle(node) {
method update (line 442) | update(toAdd, toRemove) {
method updateInput (line 477) | updateInput(node, on, keyField) {
method select (line 506) | select(nodes) {
method applyTableAction (line 515) | applyTableAction(action, args, event) {
method clearSelection (line 530) | clearSelection() {
function _add (line 543) | function _add(map, act, incrementCounts = true) {
function _filter (line 573) | function _filter(map, disableAll = false) {
function _execute (line 587) | function _execute(resources, action, args, opts = {}, ctx) {
FILE: pkg/rancher-desktop/components/SortableTable/sortable-config.ts
constant FORMATTERS (line 4) | const FORMATTERS = {};
FILE: pkg/rancher-desktop/components/SortableTable/sorting.js
constant DEFAULT_MANDATORY_SORT (line 9) | const DEFAULT_MANDATORY_SORT = ['nameSort', 'id'];
method sortFields (line 13) | sortFields() {
method arrangedRows (line 35) | arrangedRows() {
method data (line 61) | data() {
method changeSort (line 103) | changeSort(sort, desc) {
method sortFields (line 113) | sortFields() {
method descending (line 117) | descending() {
FILE: pkg/rancher-desktop/components/__tests__/BackendProgress.spec.ts
type Progress (line 6) | interface Progress {
function wrap (line 13) | function wrap(props: Record<string, any>) {
method on (line 23) | on(name: string, cb: typeof callback) {
method invoke (line 27) | invoke(name: string) {
FILE: pkg/rancher-desktop/components/__tests__/SystemPreferences.spec.js
function createWrappedPage (line 6) | function createWrappedPage(props) {
class VueSliderError (line 130) | class VueSliderError extends Error {
FILE: pkg/rancher-desktop/components/__tests__/UpdateStatus.spec.ts
function wrap (line 20) | function wrap(props: typeof UpdateStatus['$props']) {
FILE: pkg/rancher-desktop/components/form/__tests__/SplitButton.spec.ts
function wrap (line 5) | function wrap(props: Record<string, any>) {
FILE: pkg/rancher-desktop/components/form/labeled-select-utils/labeled-select-pagination.ts
type Props (line 7) | interface Props {
type Data (line 11) | interface Data {
type Computed (line 25) | interface Computed extends ComputedOptions {
type Methods (line 35) | interface Methods extends MethodOptions {
method data (line 65) | data(): Data {
method mounted (line 82) | async mounted() {
method canPaginate (line 89) | canPaginate() {
method canLoadMore (line 93) | canLoadMore() {
method optionsInPage (line 97) | optionsInPage() {
method optionCounts (line 106) | optionCounts() {
method loadMore (line 119) | loadMore() {
method setPaginationFilter (line 124) | setPaginationFilter(filter: string) {
method requestPagination (line 131) | async requestPagination(resetPage = false) {
FILE: pkg/rancher-desktop/config/__tests__/settings.spec.ts
class FakeFSError (line 19) | class FakeFSError extends Error {
method constructor (line 22) | constructor(message: string, code: string) {
type ProfileTypes (line 29) | enum ProfileTypes {
function createMocker (line 235) | function createMocker(useSystemProfile: ProfileTypes, usePersonalProfile...
function invalidProfileMessage (line 281) | function invalidProfileMessage(basename: string) {
function verifyAllFieldsAreLocked (line 301) | function verifyAllFieldsAreLocked(lockedFields: settings.LockedSettingsT...
function verifyAllFieldsAreUnlocked (line 307) | function verifyAllFieldsAreUnlocked(lockedFields: settings.LockedSetting...
FILE: pkg/rancher-desktop/config/commandLineOptions.ts
class LockedFieldError (line 15) | class LockedFieldError extends Error {}
class FatalCommandLineOptionError (line 17) | class FatalCommandLineOptionError extends Error {}
function updateFromCommandLine (line 34) | function updateFromCommandLine(cfg: Settings, lockedFields: LockedSettin...
function getObjectRepresentation (line 165) | function getObjectRepresentation(fqFieldAccessor: RecursiveKeys<Settings...
FILE: pkg/rancher-desktop/config/cookies.js
constant CSRF (line 1) | const CSRF = 'CSRF';
constant USERNAME (line 2) | const USERNAME = 'R_USERNAME';
constant LOCALE (line 3) | const LOCALE = 'R_LOCALE';
FILE: pkg/rancher-desktop/config/help.ts
type Paths (line 6) | type Paths = Record<string, string>;
class Url (line 8) | class Url {
method constructor (line 12) | constructor(paths: Paths) {
method buildUrl (line 16) | buildUrl(key: string | undefined, version: string): string {
class PreferencesHelp (line 27) | class PreferencesHelp {
method openUrl (line 44) | openUrl(version: string): void {
FILE: pkg/rancher-desktop/config/private-label.js
constant ANY (line 3) | const ANY = 0;
constant STANDARD (line 4) | const STANDARD = 1;
constant CUSTOM (line 5) | const CUSTOM = 2;
constant STANDARD_VENDOR (line 7) | const STANDARD_VENDOR = 'Rancher';
constant STANDARD_PRODUCT (line 8) | const STANDARD_PRODUCT = 'Explorer';
function setMode (line 14) | function setMode(m) {
function setVendor (line 18) | function setVendor(v) {
function setProduct (line 22) | function setProduct(p) {
function getMode (line 28) | function getMode() {
function isStandard (line 32) | function isStandard() {
function matches (line 36) | function matches(pl) {
function getVendor (line 44) | function getVendor() {
function getProduct (line 52) | function getProduct() {
FILE: pkg/rancher-desktop/config/query-params.js
constant SPA (line 2) | const SPA = 'spa';
constant LOCAL (line 5) | const LOCAL = 'local';
constant SETUP (line 6) | const SETUP = 'setup';
constant STEP (line 7) | const STEP = 'step';
constant LOGGED_OUT (line 8) | const LOGGED_OUT = 'logged-out';
constant IS_SSO (line 9) | const IS_SSO = 'is-sso';
constant IS_SLO (line 10) | const IS_SLO = 'is-slo';
constant UPGRADED (line 11) | const UPGRADED = 'upgraded';
constant TIMED_OUT (line 12) | const TIMED_OUT = 'timed-out';
constant AUTH_TEST (line 13) | const AUTH_TEST = 'test';
constant BACK_TO (line 14) | const BACK_TO = 'back-to';
constant GITHUB_CODE (line 15) | const GITHUB_CODE = 'code';
constant GITHUB_NONCE (line 16) | const GITHUB_NONCE = 'state';
constant GITHUB_SCOPE (line 17) | const GITHUB_SCOPE = 'scope';
constant GITHUB_REDIRECT (line 18) | const GITHUB_REDIRECT = 'redirect_uri';
constant SEARCH_QUERY (line 25) | const SEARCH_QUERY = 'q';
constant SORT_BY (line 26) | const SORT_BY = 'sort';
constant DESCENDING (line 27) | const DESCENDING = 'desc';
constant PAGE (line 28) | const PAGE = 'page';
constant MODE (line 31) | const MODE = 'mode';
constant FOCUS (line 45) | const FOCUS = 'focus';
constant PREVIEW (line 47) | const PREVIEW = 'preview';
constant DIFF (line 49) | const DIFF = 'diff';
constant SUB_TYPE (line 54) | const SUB_TYPE = 'type';
constant RKE_TYPE (line 55) | const RKE_TYPE = 'rkeType';
constant REPO_TYPE (line 58) | const REPO_TYPE = 'repo-type';
constant REPO (line 59) | const REPO = 'repo';
constant CHART (line 60) | const CHART = 'chart';
constant VERSION (line 61) | const VERSION = 'version';
constant NAME (line 62) | const NAME = 'name';
constant NAMESPACE (line 63) | const NAMESPACE = 'namespace';
constant DESCRIPTION (line 64) | const DESCRIPTION = 'description';
constant CATEGORY (line 65) | const CATEGORY = 'category';
constant OPERATING_SYSTEM (line 66) | const OPERATING_SYSTEM = 'os';
constant DEPRECATED (line 67) | const DEPRECATED = 'deprecated';
constant HIDDEN (line 68) | const HIDDEN = 'hidden';
constant FROM_TOOLS (line 69) | const FROM_TOOLS = 'tools';
constant FROM_CLUSTER (line 70) | const FROM_CLUSTER = 'cluster';
constant HIDE_SIDE_NAV (line 71) | const HIDE_SIDE_NAV = 'hide-side-nav';
constant PROVIDER (line 74) | const PROVIDER = 'provider';
constant CLOUD_CREDENTIAL (line 75) | const CLOUD_CREDENTIAL = 'cloud';
constant PROJECT_ID (line 78) | const PROJECT_ID = 'projectId';
constant FLAT_VIEW (line 79) | const FLAT_VIEW = 'flatView';
FILE: pkg/rancher-desktop/config/settings.ts
constant CURRENT_SETTINGS_VERSION (line 9) | const CURRENT_SETTINGS_VERSION = 18 as const;
type VMType (line 11) | enum VMType {
type ContainerEngine (line 15) | enum ContainerEngine {
type MountType (line 27) | enum MountType {
type ProtocolVersion (line 33) | enum ProtocolVersion {
type SecurityModel (line 39) | enum SecurityModel {
type CacheMode (line 46) | enum CacheMode {
type Theme (line 53) | enum Theme {
class SettingsError (line 59) | class SettingsError extends Error {
method toString (line 60) | toString() {
type Settings (line 168) | type Settings = typeof defaultSettings;
type LockedSettingsType (line 172) | type LockedSettingsType = Record<string, any>;
type DeploymentProfileType (line 174) | interface DeploymentProfileType {
constant SETTING (line 181) | const SETTING = { PL_RANCHER_VALUE: 'rancher' };
FILE: pkg/rancher-desktop/config/settingsImpl.ts
function loadFromDisk (line 37) | function loadFromDisk(): Settings {
function save (line 61) | function save(cfg: Settings) {
function getSettings (line 82) | function getSettings(): Settings {
function createSettings (line 92) | function createSettings(deploymentProfiles: DeploymentProfileType): Sett...
function clearSettings (line 110) | function clearSettings() {
function load (line 117) | function load(deploymentProfiles: DeploymentProfileType): Settings {
function finishConfiguringSettings (line 138) | function finishConfiguringSettings(cfg: Settings, deploymentProfiles: De...
function getDefaultMemory (line 165) | function getDefaultMemory() {
function merge (line 181) | function merge<T = Settings>(cfg: T, changes: RecursivePartial<Recursive...
function getLockedSettings (line 207) | function getLockedSettings(): LockedSettingsType {
function updateLockedFields (line 211) | function updateLockedFields(lockedDeploymentProfile: RecursivePartial<Se...
function determineLockedFields (line 219) | function determineLockedFields(lockedProfileSettings: LockedSettingsType...
function firstRunDialogNeeded (line 229) | function firstRunDialogNeeded() {
function turnFirstRunOff (line 233) | function turnFirstRunOff() {
function safeFileTest (line 237) | function safeFileTest(path: string, conditions: number) {
function runInDebugMode (line 247) | function runInDebugMode(debug: boolean): boolean {
function fileExists (line 251) | function fileExists(path: string) {
function fileIsWritable (line 261) | function fileIsWritable(path: string) {
function migrateSettingsLocationOnWindows (line 277) | function migrateSettingsLocationOnWindows(): boolean {
function quoteIfNeeded (line 309) | function quoteIfNeeded(fullpath: string): string {
function parseSaveError (line 313) | function parseSaveError(err: any) {
type ReplacementDirective (line 344) | interface ReplacementDirective {
function processReplacements (line 361) | function processReplacements(settings: any, replacements: ReplacementDir...
function migrateSettingsToCurrentVersion (line 521) | function migrateSettingsToCurrentVersion(settings: Record<string, any>):...
function migrateSpecifiedSettingsToCurrentVersion (line 541) | function migrateSpecifiedSettingsToCurrentVersion(settings: Record<strin...
constant SETTING (line 568) | const SETTING = { PL_RANCHER_VALUE: 'rancher' };
FILE: pkg/rancher-desktop/config/transientSettings.ts
type NavItemName (line 13) | type NavItemName = typeof navItemNames[number];
type TransientSettings (line 29) | type TransientSettings = typeof defaultTransientSettings;
class TransientSettingsImpl (line 31) | class TransientSettingsImpl {
method value (line 34) | get value(): RecursiveReadonly<TransientSettings> {
method update (line 38) | update(transientSettings: RecursivePartial<TransientSettings>) {
FILE: pkg/rancher-desktop/config/types.js
constant STEVE (line 7) | const STEVE = {
constant NORMAN (line 14) | const NORMAN = {
constant PUBLIC (line 29) | const PUBLIC = { AUTH_PROVIDER: 'authprovider' };
constant API_GROUP (line 33) | const API_GROUP = 'apiGroups';
constant API_SERVICE (line 34) | const API_SERVICE = 'apiregistration.k8s.io.apiservice';
constant CONFIG_MAP (line 35) | const CONFIG_MAP = 'configmap';
constant COUNT (line 36) | const COUNT = 'count';
constant EVENT (line 37) | const EVENT = 'event';
constant ENDPOINTS (line 38) | const ENDPOINTS = 'endpoints';
constant HPA (line 39) | const HPA = 'autoscaling.horizontalpodautoscaler';
constant INGRESS (line 40) | const INGRESS = 'networking.k8s.io.ingress';
constant NAMESPACE (line 41) | const NAMESPACE = 'namespace';
constant NODE (line 42) | const NODE = 'node';
constant NETWORK_POLICY (line 43) | const NETWORK_POLICY = 'networking.k8s.io.networkpolicy';
constant POD (line 44) | const POD = 'pod';
constant PVC (line 46) | const PVC = 'persistentvolumeclaim';
constant RESOURCE_QUOTA (line 47) | const RESOURCE_QUOTA = 'resourcequota';
constant SCHEMA (line 48) | const SCHEMA = 'schema';
constant SERVICE (line 49) | const SERVICE = 'service';
constant SECRET (line 50) | const SECRET = 'secret';
constant SERVICE_ACCOUNT (line 51) | const SERVICE_ACCOUNT = 'serviceaccount';
constant STORAGE_CLASS (line 52) | const STORAGE_CLASS = 'storage.k8s.io.storageclass';
constant OBJECT_META (line 53) | const OBJECT_META = 'io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta';
constant RBAC (line 55) | const RBAC = {
constant WORKLOAD (line 62) | const WORKLOAD = 'workload';
constant WORKLOAD_TYPES (line 65) | const WORKLOAD_TYPES = {
constant SCALABLE_WORKLOAD_TYPES (line 79) | const SCALABLE_WORKLOAD_TYPES = scalableWorkloads;
constant METRIC (line 81) | const METRIC = {
constant CATALOG (line 86) | const CATALOG = {
constant MONITORING (line 93) | const MONITORING = {
constant LONGHORN (line 115) | const LONGHORN = {
constant MANAGEMENT (line 130) | const MANAGEMENT = {
constant CAPI (line 153) | const CAPI = {
constant FLEET (line 167) | const FLEET = {
constant GATEKEEPER (line 176) | const GATEKEEPER = {
constant ISTIO (line 181) | const ISTIO = {
constant RIO (line 187) | const RIO = {
constant LOGGING (line 202) | const LOGGING = {
constant BACKUP_RESTORE (line 236) | const BACKUP_RESTORE = {
constant CIS (line 242) | const CIS = {
FILE: pkg/rancher-desktop/entry/plugins.ts
function usePlugins (line 13) | async function usePlugins(app: App, store: Store<any>) {
FILE: pkg/rancher-desktop/entry/store.ts
type Modules (line 42) | type Modules = typeof modules;
function mapTypedGetters (line 65) | function mapTypedGetters(namespace: string, arg: any) {
function mapTypedState (line 95) | function mapTypedState(namespace: string, arg: any) {
function mapTypedMutations (line 122) | function mapTypedMutations(namespace: string, arg: any) {
function mapTypedActions (line 152) | function mapTypedActions(namespace: string, arg: any) {
FILE: pkg/rancher-desktop/hocs/withCredentials.ts
function useCredentials (line 6) | function useCredentials() {
FILE: pkg/rancher-desktop/integrations/__tests__/manageLinesInFile.spec.ts
constant FILE_NAME (line 25) | const FILE_NAME = 'fakercfile';
constant TEST_LINE_1 (line 26) | const TEST_LINE_1 = 'this is test line 1';
constant TEST_LINE_2 (line 27) | const TEST_LINE_2 = 'this is test line 2';
FILE: pkg/rancher-desktop/integrations/__tests__/pathManager.spec.ts
function readdirRecursive (line 22) | function readdirRecursive(dirPath: string): string[] {
FILE: pkg/rancher-desktop/integrations/__tests__/unixIntegrationManager.spec.ts
constant INTEGRATION_DIR_NAME (line 7) | const INTEGRATION_DIR_NAME = 'integrationDir';
constant TMPDIR_PREFIX (line 8) | const TMPDIR_PREFIX = 'rdtest-';
function createTestSymlinks (line 18) | async function createTestSymlinks(integrationDirectory: string, dockerCL...
FILE: pkg/rancher-desktop/integrations/integrationManager.ts
type IntegrationManager (line 16) | interface IntegrationManager {
function getIntegrationManager (line 43) | function getIntegrationManager(): IntegrationManager {
FILE: pkg/rancher-desktop/integrations/manageLinesInFile.ts
constant START_LINE (line 9) | const START_LINE = '### MANAGED BY RANCHER DESKTOP START (DO NOT EDIT)';
constant END_LINE (line 10) | const END_LINE = '### MANAGED BY RANCHER DESKTOP END (DO NOT EDIT)';
constant DEFAULT_FILE_MODE (line 11) | const DEFAULT_FILE_MODE = 0o644;
function newErrorWithPath (line 22) | function newErrorWithPath<T extends Record<string, any>>(messageTemplate...
function manageLinesInFile (line 67) | async function manageLinesInFile(path: string, desiredManagedLines: stri...
function copyFileExtendedAttributes (line 154) | async function copyFileExtendedAttributes(fromPath: string, toPath: stri...
function splitLinesByDelimiters (line 186) | function splitLinesByDelimiters(lines: string[]): [string[], string[], s...
function getDesiredLines (line 211) | function getDesiredLines(desiredManagedLines: string[], desiredPresent: ...
function computeTargetContents (line 226) | function computeTargetContents(currentContents: string, desired: string[...
FILE: pkg/rancher-desktop/integrations/pathManager.ts
type PathManager (line 7) | interface PathManager {
class ManualPathManager (line 26) | class ManualPathManager implements PathManager {
method enforce (line 28) | async enforce(): Promise<void> {}
method remove (line 29) | async remove(): Promise<void> {}
type PathManagementStrategy (line 32) | enum PathManagementStrategy {
FILE: pkg/rancher-desktop/integrations/pathManagerImpl.ts
class RcFilePathManager (line 20) | class RcFilePathManager implements PathManager {
method constructor (line 26) | constructor() {
method enforce (line 37) | async enforce(): Promise<void> {
method remove (line 47) | async remove(): Promise<void> {
method manageLinesInFile (line 60) | protected async manageLinesInFile(fileName: string, filePath: string, ...
method managePosix (line 79) | protected async managePosix(desiredPresent: boolean): Promise<void> {
method manageCsh (line 145) | protected async manageCsh(desiredPresent: boolean): Promise<void> {
method manageFish (line 157) | protected async manageFish(desiredPresent: boolean): Promise<void> {
function getPathManagerFor (line 175) | function getPathManagerFor(strategy: PathManagementStrategy): PathManager {
FILE: pkg/rancher-desktop/integrations/unixIntegrationManager.ts
type UnixIntegrationManagerOptions (line 8) | interface UnixIntegrationManagerOptions {
class UnixIntegrationManager (line 28) | class UnixIntegrationManager implements IntegrationManager {
method constructor (line 34) | constructor(options: UnixIntegrationManagerOptions) {
method enforce (line 42) | async enforce(): Promise<void> {
method remove (line 50) | async remove(): Promise<void> {
method removeSymlinksOnly (line 60) | async removeSymlinksOnly(): Promise<void> {
method ensureIntegrationDir (line 65) | protected async ensureIntegrationDir(desiredPresent: boolean): Promise...
method ensureIntegrationSymlinks (line 78) | protected async ensureIntegrationSymlinks(desiredPresent: boolean): Pr...
method ensureDockerCliSymlinks (line 128) | protected async ensureDockerCliSymlinks(desiredPresent: boolean): Prom...
method listIntegrations (line 157) | listIntegrations(): Promise<Record<string, boolean | string> | null> {
method weOwnDockerCliFile (line 163) | protected async weOwnDockerCliFile(filePath: string): Promise<boolean> {
function ensureSymlink (line 215) | async function ensureSymlink(srcPath: string, dstPath: string): Promise<...
FILE: pkg/rancher-desktop/integrations/windowsIntegrationManager.ts
constant DISTRO_BLACKLIST (line 28) | const DISTRO_BLACKLIST = [
class WSLDistro (line 39) | class WSLDistro {
method constructor (line 43) | constructor(name: string, version: number) {
type SyncStateKey (line 52) | enum SyncStateKey {
type SyncState (line 61) | type SyncState =
type DiagnosticKey (line 71) | type DiagnosticKey =
class WindowsIntegrationManager (line 86) | class WindowsIntegrationManager implements IntegrationManager {
method constructor (line 113) | constructor() {
method getInstance (line 149) | public static getInstance(): WindowsIntegrationManager {
method enforce (line 155) | async enforce(): Promise<void> {
method remove (line 160) | async remove(): Promise<void> {
method sync (line 165) | async sync(): Promise<void> {
method syncDistro (line 231) | async syncDistro(distro: string, kubeconfigPath?: string): Promise<voi...
method diagnostic (line 255) | protected diagnostic(input: { key: DiagnosticKey, distro?: string, err...
method wslExe (line 272) | protected get wslExe(): Promise<string> {
method execCommand (line 296) | protected async execCommand(opts: { distro?: string, encoding?: Buffer...
method captureCommand (line 327) | protected async captureCommand(opts: { distro?: string, encoding?: Buf...
method getLinuxToolPath (line 354) | protected async getLinuxToolPath(distro: string, tool: string): Promis...
method syncHostSocketProxy (line 360) | protected async syncHostSocketProxy(): Promise<void> {
method dockerSocketProxyReason (line 380) | get dockerSocketProxyReason(): string | undefined {
method syncDistroSocketProxy (line 398) | protected async syncDistroSocketProxy(distro: string, state: boolean) {
method syncHostDockerPluginConfig (line 444) | protected async syncHostDockerPluginConfig() {
method syncDistroDockerPlugins (line 487) | protected async syncDistroDockerPlugins(distro: string, state: boolean...
method verifyAllDistrosKubeConfig (line 516) | async verifyAllDistrosKubeConfig() {
method verifyDistroKubeConfig (line 528) | protected async verifyDistroKubeConfig(distro: string) {
method syncDistroKubeconfig (line 547) | protected async syncDistroKubeconfig(distro: string, kubeconfigPath: s...
method syncDistroSpinCLI (line 587) | protected async syncDistroSpinCLI(distro: string, state: boolean) {
method nonBlacklistedDistros (line 613) | protected get nonBlacklistedDistros(): Promise<WSLDistro[]> {
method supportedDistros (line 640) | protected get supportedDistros(): Promise<WSLDistro[]> {
method markIntegration (line 646) | protected async markIntegration(distro: string, state: boolean): Promi...
method listIntegrations (line 657) | async listIntegrations(): Promise<Record<string, boolean | string>> {
method getStateForIntegration (line 669) | protected async getStateForIntegration(distro: WSLDistro): Promise<boo...
method removeSymlinksOnly (line 697) | async removeSymlinksOnly(): Promise<void> {}
FILE: pkg/rancher-desktop/main/__tests__/containerExec.spec.ts
function makeProcess (line 29) | function makeProcess() {
function makeCheckProcess (line 44) | function makeCheckProcess(exitCode = 0) {
function makeFrame (line 56) | function makeFrame() {
function makeEvent (line 61) | function makeEvent(frame = makeFrame()) {
function startSession (line 69) | async function startSession(handler: any, containerId: string) {
FILE: pkg/rancher-desktop/main/__tests__/deploymentProfiles.spec.ts
function clearRegistry (line 172) | async function clearRegistry() {
function installInRegistry (line 180) | async function installInRegistry(regFileContents: string) {
function stringToMultiStringHexBytes (line 194) | function stringToMultiStringHexBytes(s: string[]): string {
FILE: pkg/rancher-desktop/main/__tests__/ipcMain.spec.ts
type Handler (line 9) | type Handler = (event: Electron.IpcMainInvokeEvent, ...args: any) => Pro...
class E (line 16) | class E extends events.EventEmitter implements Electron.IpcMain {
method handle (line 19) | handle(channel: string, handler: Handler) {
method handleOnce (line 23) | handleOnce(channel: string, handler: Handler) {
method handleInternal (line 27) | protected handleInternal(channel: string, handler: Handler, once: bool...
method removeHandler (line 34) | removeHandler(channel: string) {
method invoke (line 38) | invoke(channel: string, ...args: any) {
method clear (line 59) | clear() {
type cbType (line 142) | type cbType = Parameters<typeof subject.handle<typeof topic>>[1];
type cbType (line 154) | type cbType = Parameters<typeof subject.handle<typeof topic>>[1];
type cbType (line 167) | type cbType = Parameters<typeof subject.handle<typeof topic>>[1];
FILE: pkg/rancher-desktop/main/commandServer/__tests__/settingsValidator.spec.ts
function checkSetting (line 116) | function checkSetting(path: string[], defaultSettings: any) {
function configWithValue (line 238) | function configWithValue(value: string | settings.ContainerEngine): sett...
function checkForError (line 923) | function checkForError(needToUpdate: boolean, errors: string[], errorMes...
function getVMTypeSetting (line 931) | function getVMTypeSetting(vmType: VMType): RecursivePartial<settings.Set...
function getMountTypeSetting (line 939) | function getMountTypeSetting(mountType: MountType): RecursivePartial<set...
FILE: pkg/rancher-desktop/main/commandServer/httpCommandServer.ts
type BackendState (line 25) | interface BackendState {
type ServerState (line 33) | interface ServerState {
type DispatchFunctionType (line 40) | type DispatchFunctionType = (request: express.Request, response: express...
type HttpMethod (line 41) | type HttpMethod = 'get' | 'put' | 'post';
constant SERVER_PORT (line 44) | const SERVER_PORT = 6107;
constant SERVER_FILE_BASENAME (line 45) | const SERVER_FILE_BASENAME = 'rd-engine.json';
constant MAX_REQUEST_BODY_LENGTH (line 46) | const MAX_REQUEST_BODY_LENGTH = 4194304;
class HttpCommandServer (line 48) | class HttpCommandServer {
method constructor (line 112) | constructor(commandWorker: CommandWorkerInterface) {
method init (line 117) | async init() {
method setupRoutes (line 146) | protected setupRoutes() {
method handleCORS (line 222) | protected handleCORS(request: express.Request, response: express.Respo...
method handleError (line 240) | protected handleError(err: Error, request: express.Request, response: ...
method diagnosticCategories (line 249) | protected diagnosticCategories(request: express.Request, response: exp...
method diagnosticIDsForCategory (line 265) | protected diagnosticIDsForCategory(request: express.Request, response:...
method diagnosticChecks (line 292) | protected async diagnosticChecks(request: express.Request, response: e...
method diagnosticRunChecks (line 304) | protected async diagnosticRunChecks(request: express.Request, response...
method invalidAPIVersionCall (line 312) | protected invalidAPIVersionCall(neededVersion: number, request: expres...
method about (line 325) | protected about(request: express.Request, response: express.Response, ...
method listSettings (line 334) | protected listSettings(request: express.Request, response: express.Res...
method listLockedSettings (line 348) | protected listLockedSettings(request: express.Request, response: expre...
method listEndpoints (line 362) | protected listEndpoints(version: string, request: express.Request, res...
method sortFavoringGetMethod (line 399) | protected sortFavoringGetMethod(returnedPaths: [Uppercase<HttpMethod>,...
method readRequestSettings (line 415) | protected async readRequestSettings<T>(
method updateSettings (line 453) | async updateSettings(request: express.Request, response: express.Respo...
method proposeSettings (line 480) | async proposeSettings(request: express.Request, response: express.Resp...
method factoryReset (line 507) | async factoryReset(request: express.Request, response: express.Respons...
method k8sReset (line 540) | async k8sReset(request: express.Request, response: express.Response, c...
method createPortForwarding (line 569) | protected async createPortForwarding(request: express.Request, respons...
method deletePortForwarding (line 625) | protected async deletePortForwarding(request: express.Request, respons...
method wrapShutdown (line 657) | wrapShutdown(request: express.Request, response: express.Response, con...
method closeServer (line 668) | closeServer() {
method listTransientSettings (line 672) | protected listTransientSettings(request: express.Request, response: ex...
method updateTransientSettings (line 680) | protected async updateTransientSettings(
method listExtensions (line 711) | protected async listExtensions(request: express.Request, response: exp...
method installExtension (line 721) | protected async installExtension(request: express.Request, response: e...
method uninstallExtension (line 744) | protected async uninstallExtension(request: express.Request, response:...
method getBackendState (line 768) | protected async getBackendState(_: express.Request, response: express....
method setBackendState (line 777) | protected async setBackendState(request: express.Request, response: ex...
method listSnapshots (line 796) | protected async listSnapshots(request: express.Request, response: expr...
method createSnapshot (line 802) | protected async createSnapshot(request: express.Request, response: exp...
method restoreSnapshot (line 830) | protected async restoreSnapshot(request: express.Request, response: ex...
method cancelSnapshot (line 852) | protected async cancelSnapshot(_request: express.Request, response: ex...
method deleteSnapshot (line 866) | protected async deleteSnapshot(request: express.Request, response: exp...
type commandContext (line 889) | interface commandContext {
type CommandWorkerInterface (line 899) | interface CommandWorkerInterface {
type CommandContext (line 946) | type CommandContext = commandContext;
FILE: pkg/rancher-desktop/main/commandServer/settingsValidator.ts
type settingsLike (line 24) | type settingsLike = Record<string, any>;
type ValidatorFunc (line 36) | type ValidatorFunc<S, C, D, N extends string> =
type SettingsValidationMapEntry (line 45) | type SettingsValidationMapEntry<S, T, N extends string = ''> = {
type SettingsValidationMap (line 61) | type SettingsValidationMap = SettingsValidationMapEntry<Settings, Settin...
type TransientSettingsValidationMap (line 63) | type TransientSettingsValidationMap = SettingsValidationMapEntry<Transie...
class SettingsValidator (line 65) | class SettingsValidator {
method validateSettings (line 73) | validateSettings(
method validateTransientSettings (line 196) | validateTransientSettings(
method checkProposedSettings (line 238) | protected checkProposedSettings<S>(
method invalidSettingMessage (line 294) | protected invalidSettingMessage(fqname: string, desiredValue: any): st...
method checkLima (line 302) | protected checkLima<C, D, N extends string>(validator: ValidatorFunc<S...
method checkRosetta (line 317) | protected checkRosetta(mergedSettings: Settings, currentValue: boolean...
method checkVMType (line 336) | protected checkVMType(mergedSettings: Settings, currentValue: string, ...
method checkMountType (line 370) | protected checkMountType(mergedSettings: Settings, currentValue: strin...
method checkSpinkube (line 393) | protected checkSpinkube(mergedSettings: Settings, currentValue: boolea...
method checkWASMWithMobyStorage (line 408) | protected checkWASMWithMobyStorage<
method checkPlatform (line 430) | protected checkPlatform<C, D, N extends string>(platform: NodeJS.Platf...
method check9P (line 445) | protected check9P<C, D, N extends string>(validator: ValidatorFunc<Set...
method checkMulti (line 460) | protected checkMulti<S, C, D, N extends string>(...validators: Validat...
method checkBoolean (line 475) | protected checkBoolean<S>(mergedSettings: S, currentValue: boolean, de...
method checkNumber (line 488) | protected checkNumber(min: number, max: number) {
method checkEnum (line 505) | protected checkEnum(...validValues: string[]) {
method checkString (line 525) | protected checkString<S>(mergedSettings: S, currentValue: string, desi...
method parseByteUnits (line 541) | protected parseByteUnits(input: string): number | undefined {
method checkByteUnits (line 560) | protected checkByteUnits(_: Settings, currentValue: string, desiredVal...
method checkKubernetesVersion (line 575) | protected checkKubernetesVersion(mergedSettings: Settings, currentValu...
method notSupported (line 588) | protected notSupported(fqname: string) {
method checkUnchanged (line 592) | protected checkUnchanged<S>(mergedSettings: S, currentValue: any, desi...
method checkBooleanMapping (line 606) | protected checkBooleanMapping<S>(mergedSettings: S, currentValue: Reco...
method checkUniqueStringArray (line 626) | protected checkUniqueStringArray<S>(mergedSettings: S, currentValue: s...
method findDuplicates (line 644) | protected findDuplicates(list: string[]): string[] {
method checkInstalledExtensions (line 666) | protected checkInstalledExtensions(
method checkExtensionAllowList (line 698) | protected checkExtensionAllowList(
method checkPreferencesNavItemCurrent (line 725) | protected checkPreferencesNavItemCurrent(
method checkPreferencesNavItemCurrentTabs (line 741) | protected checkPreferencesNavItemCurrentTabs(
method canonicalizeSynonyms (line 773) | canonicalizeSynonyms(newSettings: settingsLike): void {
method canonicalizeSettings (line 781) | protected canonicalizeSettings(synonymsTable: settingsLike, newSetting...
method canonicalizeKubernetesVersion (line 795) | protected canonicalizeKubernetesVersion(newSettings: settingsLike, ind...
method canonicalizeContainerEngine (line 805) | protected canonicalizeContainerEngine(newSettings: settingsLike, index...
method canonicalizeBool (line 811) | protected canonicalizeBool(newSettings: settingsLike, index: string): ...
method canonicalizeNumber (line 821) | protected canonicalizeNumber(newSettings: settingsLike, index: string)...
FILE: pkg/rancher-desktop/main/containerExec.ts
constant MAX_OUTPUT_BUF (line 21) | const MAX_OUTPUT_BUF = 50 * 1024;
type ExecSession (line 23) | interface ExecSession {
class ContainerExecHandler (line 30) | class ContainerExecHandler {
method constructor (line 33) | constructor(protected client: ContainerEngineClient) {
method updateClient (line 37) | updateClient(client: ContainerEngineClient) {
method killAll (line 42) | killAll() {
method checkScriptAvailable (line 53) | protected async checkScriptAvailable(containerId: string, namespace: s...
method initHandlers (line 70) | protected initHandlers() {
FILE: pkg/rancher-desktop/main/credentialServer/credentialUtils.ts
type credHelperInfo (line 11) | interface credHelperInfo {
function runCommand (line 25) | async function runCommand(command: string, input?: string): Promise<stri...
function list (line 49) | async function list(): Promise<Record<string, string>> {
function getCredentialHelperInfo (line 79) | async function getCredentialHelperInfo(command: string, payload: string)...
function runCredHelper (line 114) | async function runCredHelper(helper: string, command: string, input?: st...
FILE: pkg/rancher-desktop/main/credentialServer/httpCredentialHelperServer.ts
type ServerState (line 13) | interface ServerState {
constant SERVER_PORT (line 20) | const SERVER_PORT = 6109;
constant SERVER_USERNAME (line 22) | const SERVER_USERNAME = 'user';
constant SERVER_FILE_BASENAME (line 23) | const SERVER_FILE_BASENAME = 'credential-server.json';
constant MAX_REQUEST_BODY_LENGTH (line 24) | const MAX_REQUEST_BODY_LENGTH = 4194304;
type checkerFnType (line 26) | type checkerFnType = (stdout: string) => boolean;
function requireNoOutput (line 28) | function requireNoOutput(stdout: string): boolean {
function requireNonEmptyOutput (line 32) | function requireNonEmptyOutput(stdout: string): boolean {
function requireJSONOutput (line 36) | function requireJSONOutput(stdout: string): boolean {
function getServerCredentialsPath (line 47) | function getServerCredentialsPath(): string {
function ensureEndsWithNewline (line 51) | function ensureEndsWithNewline(s: string) {
class HttpCredentialHelperServer (line 55) | class HttpCredentialHelperServer {
method init (line 67) | async init() {
method handleRequest (line 81) | protected async handleRequest(request: http.IncomingMessage, response:...
method doCommand (line 123) | protected async doCommand(
method runCommand (line 143) | protected async runCommand(
method closeServer (line 176) | closeServer() {
FILE: pkg/rancher-desktop/main/dashboardServer/index.ts
type ProxyKeys (line 15) | type ProxyKeys = typeof ProxyKeys[number];
class DashboardServer (line 22) | class DashboardServer {
method getInstance (line 55) | public static getInstance(): DashboardServer {
method init (line 64) | public init() {
method stop (line 119) | public stop() {
FILE: pkg/rancher-desktop/main/deploymentProfiles.ts
class DeploymentProfileError (line 18) | class DeploymentProfileError extends Error {
method toString (line 19) | toString() {
constant REGISTRY_PROFILE_PATHS (line 26) | const REGISTRY_PROFILE_PATHS = [
function readDeploymentProfiles (line 42) | async function readDeploymentProfiles(registryProfilePath = REGISTRY_PRO...
function convertAndParsePlist (line 112) | async function convertAndParsePlist(inputPath: string): Promise<undefine...
function parseJsonFromPlists (line 153) | async function parseJsonFromPlists(rootPath: string, defaultsPath: strin...
function parseJsonFiles (line 168) | function parseJsonFiles(rootPath: string, defaultsPath: string, lockedPa...
class Win32DeploymentReader (line 185) | class Win32DeploymentReader {
method constructor (line 191) | constructor(registryPathProfiles: string[][]) {
method readProfile (line 196) | readProfile(): settings.DeploymentProfileType {
method fullRegistryPath (line 259) | protected fullRegistryPath(...pathParts: string[]): string {
method msgFieldExpectingReceived (line 263) | protected msgFieldExpectingReceived(field: string, expected: string, r...
method msgFieldExpectingTypeReceived (line 267) | protected msgFieldExpectingTypeReceived(field: string, expectedType: s...
method readRegistryUsingSchema (line 278) | protected readRegistryUsingSchema(schemaObj: Record<string, any>, regK...
method readRegistryObject (line 376) | protected readRegistryObject(regKey: nativeReg.HKEY, pathParts: string...
method readRegistryValue (line 410) | protected readRegistryValue(schemaVal: any, regKey: nativeReg.HKEY, pa...
function validateDeploymentProfile (line 509) | function validateDeploymentProfile(inputPath: string, profile: any, sche...
function validateDeploymentProfileWithErrors (line 528) | function validateDeploymentProfileWithErrors(profile: any, errors: strin...
function isEquivalentIgnoreCase (line 572) | function isEquivalentIgnoreCase(a: string, b: string): boolean {
function fixProfileKeyCase (line 576) | function fixProfileKeyCase(key: string, schemaKeys: string[]): string | ...
function haveUserDefinedObject (line 596) | function haveUserDefinedObject(pathParts: string[]): boolean {
FILE: pkg/rancher-desktop/main/diagnostics/__tests__/diagnostics.spec.ts
method applicable (line 22) | applicable() {
method applicable (line 35) | applicable() {
method applicable (line 48) | applicable() {
FILE: pkg/rancher-desktop/main/diagnostics/__tests__/dockerCliSymlinks.spec.ts
function wrongFirstLinkError (line 97) | function wrongFirstLinkError(desc: string) {
function badFirstLinkError (line 101) | function badFirstLinkError(desc: string) {
function badSecondLinkError (line 105) | function badSecondLinkError(desc: string) {
function problematicSecondLinkError (line 109) | function problematicSecondLinkError(desc: string) {
function intermediateFileNotSymlinkError (line 113) | function intermediateFileNotSymlinkError(desc: string) {
FILE: pkg/rancher-desktop/main/diagnostics/connectedToInternet.ts
function checkNetworkConnectivity (line 32) | async function checkNetworkConnectivity(): Promise<boolean> {
method applicable (line 63) | applicable() {
method check (line 66) | async check() {
FILE: pkg/rancher-desktop/main/diagnostics/diagnostics.ts
type DiagnosticsResult (line 13) | type DiagnosticsResult = DiagnosticsCheckerResult & {
type DiagnosticsResultCollection (line 25) | interface DiagnosticsResultCollection {
class DiagnosticsManager (line 34) | class DiagnosticsManager {
method constructor (line 52) | constructor(diagnostics?: DiagnosticsChecker[]) {
method getCategoryNames (line 100) | getCategoryNames(): string[] {
method getIdsForCategory (line 107) | getIdsForCategory(categoryName: string): string[] | undefined {
method applicableCheckers (line 111) | protected async applicableCheckers(categoryName: string | null, id: st...
method getChecks (line 142) | async getChecks(categoryName: string | null, id: string | null): Promi...
method runChecker (line 174) | protected async runChecker(checker: DiagnosticsChecker) {
method runChecks (line 200) | async runChecks(): Promise<DiagnosticsResultCollection> {
FILE: pkg/rancher-desktop/main/diagnostics/dockerCliSymlinks.ts
function replaceHome (line 13) | function replaceHome(input: string) {
class CheckerDockerCLISymlink (line 21) | class CheckerDockerCLISymlink implements DiagnosticsChecker {
method constructor (line 22) | constructor(name: string) {
method id (line 27) | get id() {
method applicable (line 32) | applicable() {
method check (line 42) | async check() {
FILE: pkg/rancher-desktop/main/diagnostics/dockerContext.ts
method applicable (line 10) | async applicable(): Promise<boolean> {
method check (line 15) | async check(): Promise<DiagnosticsCheckerSingleResult[]> {
FILE: pkg/rancher-desktop/main/diagnostics/integrationsWindows.ts
method applicable (line 10) | applicable() {
method check (line 13) | check(): Promise<DiagnosticsCheckerSingleResult[]> {
FILE: pkg/rancher-desktop/main/diagnostics/kubeConfigSymlink.ts
function verifyKubeConfigSymlink (line 8) | async function verifyKubeConfigSymlink(): Promise<boolean> {
method applicable (line 29) | applicable() {
method check (line 32) | async check() {
FILE: pkg/rancher-desktop/main/diagnostics/kubeContext.ts
method applicable (line 15) | async applicable(): Promise<boolean> {
method check (line 22) | async check(): Promise<DiagnosticsCheckerResult> {
FILE: pkg/rancher-desktop/main/diagnostics/kubeVersionsAvailable.ts
class KubeVersionsAvailable (line 21) | class KubeVersionsAvailable implements DiagnosticsChecker {
method applicable (line 24) | applicable(): Promise<boolean> {
method check (line 28) | check(): Promise<DiagnosticsCheckerResult> {
FILE: pkg/rancher-desktop/main/diagnostics/limaDarwin.ts
method applicable (line 26) | applicable() {
method check (line 32) | check() {
FILE: pkg/rancher-desktop/main/diagnostics/limaOverrides.ts
method applicable (line 18) | applicable() {
method check (line 21) | async check() {
FILE: pkg/rancher-desktop/main/diagnostics/mobyImageStore.ts
class CheckMobyImageStore (line 34) | class CheckMobyImageStore implements DiagnosticsChecker {
method applicable (line 38) | applicable(): Promise<boolean> {
method check (line 42) | async check() {
FILE: pkg/rancher-desktop/main/diagnostics/mockForScreenshots.ts
class MockChecker (line 6) | class MockChecker implements DiagnosticsChecker {
method id (line 7) | get id() {
method applicable (line 12) | applicable(): Promise<boolean> {
method check (line 16) | check() {
FILE: pkg/rancher-desktop/main/diagnostics/pathManagement.ts
method applicable (line 15) | applicable() {
method check (line 18) | check(): Promise<DiagnosticsCheckerSingleResult[]> {
FILE: pkg/rancher-desktop/main/diagnostics/rdBinInShell.ts
class RDBinInShellPath (line 21) | class RDBinInShellPath implements DiagnosticsChecker {
method constructor (line 22) | constructor(id: string, executable: string, ...args: string[]) {
method applicable (line 32) | applicable(): Promise<boolean> {
method check (line 36) | async check(): Promise<DiagnosticsCheckerResult> {
method removeTrailingSlash (line 88) | static removeTrailingSlash(s: string): string {
FILE: pkg/rancher-desktop/main/diagnostics/testCheckers.ts
class CheckTesting (line 8) | class CheckTesting implements DiagnosticsChecker {
method constructor (line 10) | constructor(pass: boolean) {
method id (line 14) | get id() {
method applicable (line 19) | applicable(): Promise<boolean> {
method check (line 23) | check() {
FILE: pkg/rancher-desktop/main/diagnostics/types.ts
type DiagnosticsCategory (line 1) | enum DiagnosticsCategory {
type DiagnosticsFix (line 9) | interface DiagnosticsFix {
type DiagnosticsCheckerResult (line 18) | interface DiagnosticsCheckerResult {
type DiagnosticsCheckerSingleResult (line 29) | type DiagnosticsCheckerSingleResult = DiagnosticsCheckerResult & {
type DiagnosticsChecker (line 41) | interface DiagnosticsChecker {
FILE: pkg/rancher-desktop/main/diagnostics/wslDistros.ts
class CheckWSLDistros (line 8) | class CheckWSLDistros implements DiagnosticsChecker {
method applicable (line 12) | applicable(): Promise<boolean> {
method check (line 16) | async check() {
FILE: pkg/rancher-desktop/main/diagnostics/wslInfo.ts
class CheckWSLFromStore (line 8) | class CheckWSLFromStore implements DiagnosticsChecker {
method applicable (line 12) | applicable(): Promise<boolean> {
method check (line 16) | async check() {
FILE: pkg/rancher-desktop/main/extensions/extensions.ts
type ComposeFile (line 26) | interface ComposeFile {
type ScriptType (line 51) | type ScriptType = keyof {
class ExtensionErrorImpl (line 57) | class ExtensionErrorImpl extends Error implements ExtensionError {
method constructor (line 61) | constructor(code: ExtensionErrorCode, message: string, cause?: Error) {
function isVMTypeImage (line 77) | function isVMTypeImage(input: ExtensionMetadata['vm']): input is { image...
function isVMTypeComposefile (line 84) | function isVMTypeComposefile(input: ExtensionMetadata['vm']): input is {...
class ExtensionImpl (line 88) | class ExtensionImpl implements Extension {
method constructor (line 89) | constructor(id: string, tag: string, client: ContainerEngineClient) {
method extensionNamespace (line 110) | protected get extensionNamespace() {
method image (line 114) | get image() {
method metadata (line 119) | get metadata(): Promise<ExtensionMetadata> {
method labels (line 145) | get labels(): Promise<Record<string, string>> {
method iconName (line 173) | get iconName(): Promise<string> {
method checkInstallAllowed (line 186) | protected static checkInstallAllowed(allowedImages: readonly string[] ...
method getScriptArgs (line 233) | protected getScriptArgs(metadata: ExtensionMetadata, key: ScriptType):...
method install (line 256) | async install(allowedImages: readonly string[] | undefined): Promise<b...
method installMetadata (line 304) | protected async installMetadata(workDir: string, metadata: ExtensionMe...
method installIcon (line 315) | protected async installIcon(workDir: string, metadata: ExtensionMetada...
method installUI (line 333) | protected async installUI(workDir: string, metadata: ExtensionMetadata...
method platform (line 360) | protected get platform() {
method installHostExecutables (line 372) | protected async installHostExecutables(workDir: string, metadata: Exte...
method getComposeName (line 388) | protected async getComposeName() {
method getComposeFileContents (line 417) | protected async getComposeFileContents(): Promise<ComposeFile> {
method installContainers (line 444) | protected async installContainers(workDir: string, metadata: Extension...
method markInstalled (line 514) | protected async markInstalled(workDir: string) {
method uninstall (line 518) | async uninstall(): Promise<boolean> {
method uninstallContainers (line 568) | protected async uninstallContainers() {
method getInstalledVersion (line 586) | protected async getInstalledVersion(): Promise<string | undefined> {
method isInstalled (line 597) | async isInstalled(): Promise<boolean> {
method composeFile (line 602) | get composeFile(): Promise<any> {
method getBackendPort (line 615) | async getBackendPort() {
method composeExec (line 630) | async composeExec(options: SpawnOptions): Promise<ChildProcessByStdio<...
method extractFile (line 655) | async extractFile(sourcePath: string, destinationPath: string): Promis...
method readFile (line 663) | async readFile(sourcePath: string): Promise<string> {
method shutdown (line 667) | async shutdown() {
FILE: pkg/rancher-desktop/main/extensions/manager.ts
type IpcMainEventListener (line 31) | type IpcMainEventListener<K extends keyof IpcMainEvents> =
type IpcMainEventHandler (line 34) | type IpcMainEventHandler<K extends keyof IpcMainInvokeEvents> =
type ReadableChildProcess (line 38) | type ReadableChildProcess = ChildProcessByStdio<null, Readable, Readable>;
constant EXTENSION_APP (line 44) | const EXTENSION_APP = '<app>';
class ExtensionManagerImpl (line 54) | class ExtensionManagerImpl implements ExtensionManager {
method constructor (line 62) | constructor(client: ContainerEngineClient, containerd: boolean) {
method setMainListener (line 96) | protected setMainListener<K extends keyof IpcMainEvents>(channel: K, l...
method setMainHandler (line 112) | protected setMainHandler<K extends keyof IpcMainInvokeEvents>(channel:...
method init (line 129) | async init(config: RecursiveReadonly<Settings>) {
method isSupported (line 312) | protected isSupported(repo: string): boolean {
method getExtension (line 346) | async getExtension(image: string, options: { preferInstalled?: boolean...
method findBestVersion (line 383) | protected async findBestVersion(imageName: string): Promise<string> {
method getInstalledExtensions (line 424) | async getInstalledExtensions() {
method getExtensionIdFromEvent (line 437) | protected getExtensionIdFromEvent(event: IpcMainEvent | IpcMainInvokeE...
method spawnHost (line 450) | protected async spawnHost(event: IpcMainEvent | IpcMainInvokeEvent, op...
method spawnDockerCli (line 487) | protected async spawnDockerCli(event: IpcMainEvent | IpcMainInvokeEven...
method spawnContainer (line 509) | protected async spawnContainer(event: IpcMainEvent | IpcMainInvokeEven...
method execBlocking (line 531) | protected execBlocking(process: ReadableChildProcess): Promise<SpawnRe...
method execStreaming (line 567) | protected execStreaming(event: IpcMainEvent, options: SpawnOptions, pr...
method shutdown (line 621) | shutdown() {
function getExtensionManager (line 650) | function getExtensionManager(): Promise<ExtensionManager | undefined> {
function initializeExtensionManager (line 654) | async function initializeExtensionManager(client: ContainerEngineClient,...
FILE: pkg/rancher-desktop/main/extensions/types.ts
type PlatformSpecific (line 9) | type PlatformSpecific<T> = Record<'darwin' | 'windows' | 'linux', T>;
type ExtensionMetadata (line 11) | interface ExtensionMetadata {
type Extension (line 68) | interface Extension {
type ExtensionManager (line 127) | interface ExtensionManager {
type SpawnOptions (line 157) | interface SpawnOptions {
type SpawnResult (line 185) | interface SpawnResult {
type ExtensionErrorCode (line 198) | enum ExtensionErrorCode {
type ExtensionError (line 204) | interface ExtensionError extends Error {
function isExtensionError (line 209) | function isExtensionError(error: Error): error is ExtensionError {
FILE: pkg/rancher-desktop/main/imageEvents.ts
class ImageEventHandler (line 27) | class ImageEventHandler {
method constructor (line 32) | constructor(imageProcessor: ImageProcessor) {
method onImagesChanged (line 37) | protected onImagesChanged(images: ImageType[]) {
method initEventHandlers (line 41) | protected initEventHandlers() {
FILE: pkg/rancher-desktop/main/ipcMain.ts
function removeCircularReferences (line 9) | function removeCircularReferences(property: string | symbol, value: any)...
function makeArgsPrintable (line 17) | function makeArgsPrintable(args: any[]): string[] {
type IpcMainProxy (line 33) | interface IpcMainProxy {
type Listener (line 65) | type Listener = (event: Electron.IpcMainEvent, ...args: any) => void;
type Handler (line 66) | type Handler = (event: Electron.IpcMainInvokeEvent, ...args: any) => Pro...
class IpcMainProxyImpl (line 68) | class IpcMainProxyImpl implements IpcMainProxy {
method constructor (line 69) | constructor(logger: Log, ipcMain?: Electron.IpcMain) {
method on (line 84) | on(channel: string, listener: Listener): this {
method addListener (line 99) | addListener(channel: string, listener: Listener): this {
method prependListener (line 103) | prependListener(channel: string, listener: Listener): this {
method once (line 118) | once(channel: string, listener: Listener): this {
method prependOnceListener (line 133) | prependOnceListener(channel: string, listener: Listener): this {
method removeListener (line 148) | removeListener(channel: string, listener: Listener): this {
method off (line 160) | off(channel: string, listener: Listener): this {
method removeAllListeners (line 164) | removeAllListeners(channel?: string): this {
method setMaxListeners (line 170) | setMaxListeners(n: number): this {
method getMaxListeners (line 176) | getMaxListeners(): number {
method listeners (line 180) | listeners(eventName: string | symbol) {
method rawListeners (line 184) | rawListeners(eventName: string | symbol) {
method listenerCount (line 188) | listenerCount(eventName: string | symbol, listener?: Listener): number {
method emit (line 192) | emit(eventName: string | symbol, ...args: any[]): boolean {
method eventNames (line 196) | eventNames(): (string | symbol)[] {
method handle (line 203) | handle(channel: string, handler: Handler): void {
method handleOnce (line 215) | handleOnce(channel: string, handler: Handler) {
method removeHandler (line 227) | removeHandler(channel: string): void {
function getIpcMainProxy (line 232) | function getIpcMainProxy(logger: Log, ipcMain?: Electron.IpcMain): IpcMa...
FILE: pkg/rancher-desktop/main/mainEvents.ts
class NoMainEventsHandlerError (line 14) | class NoMainEventsHandlerError extends Error {
method constructor (line 15) | constructor(eventName: string) {
type MainEventNames (line 28) | interface MainEventNames {
type DiagnosticsEventPayload (line 174) | type DiagnosticsEventPayload =
type IsHandler (line 185) | type IsHandler<eventName extends keyof MainEventNames> =
type HandlerParams (line 195) | type HandlerParams<eventName extends keyof MainEventNames> =
type HandlerReturn (line 205) | type HandlerReturn<eventName extends keyof MainEventNames> =
type HandlerType (line 214) | type HandlerType<eventName extends keyof MainEventNames> =
type MainEvents (line 219) | interface MainEvents extends EventEmitter {
class MainEventsImpl (line 263) | class MainEventsImpl extends EventEmitter implements MainEvents {
method emit (line 273) | emit(eventName: string, ...args: any[]): boolean {
method on (line 282) | on(eventName: string, listener: (...args: any[]) => void) {
method once (line 291) | once(eventName: string, listener: (...args: any[]) => void) {
method off (line 300) | off(eventName: string, listener: (...args: any[]) => void) {
method invoke (line 304) | async invoke<eventName extends keyof MainEventNames>(
method tryInvoke (line 316) | async tryInvoke<eventName extends keyof MainEventNames>(
method handle (line 325) | handle<eventName extends keyof MainEventNames>(
FILE: pkg/rancher-desktop/main/mainmenu.ts
function versionedDocsUrl (line 8) | async function versionedDocsUrl() {
function buildApplicationMenu (line 15) | function buildApplicationMenu(): void {
function getApplicationMenu (line 22) | function getApplicationMenu(): MenuItem[] {
function getEditMenu (line 35) | function getEditMenu(isMac: boolean): MenuItem {
function getViewMenu (line 52) | function getViewMenu(): MenuItem {
function getHelpMenu (line 91) | function getHelpMenu(isMac: boolean): MenuItem {
function getMacApplicationMenu (line 138) | function getMacApplicationMenu(): MenuItem[] {
function getWindowsApplicationMenu (line 169) | function getWindowsApplicationMenu(): MenuItem[] {
function getPreferencesMenuItem (line 192) | function getPreferencesMenuItem(): MenuItemConstructorOptions[] {
function adjustZoomLevel (line 212) | function adjustZoomLevel(focusedWindow: Electron.BaseWindow | undefined,...
FILE: pkg/rancher-desktop/main/networking/__tests__/mac-ca.spec.ts
type testCertMock (line 22) | interface testCertMock {
function mockSpawnFile (line 78) | async function mockSpawnFile(command: string, args: string[], opts: { st...
FILE: pkg/rancher-desktop/main/networking/cert-parse.ts
function parseIssuer (line 149) | function parseIssuer(encoded: any): Record<string, string> {
function convertDate (line 175) | function convertDate(val: string | undefined, fn: 'utcTimeToDate' | 'gen...
function tryPemDecode (line 184) | function tryPemDecode(pem: string) {
function checkCertValidity (line 198) | function checkCertValidity(pem: string): boolean {
FILE: pkg/rancher-desktop/main/networking/index.ts
function setupNetworking (line 20) | async function setupNetworking() {
function checkConnectivity (line 135) | async function checkConnectivity(target: string): Promise<boolean> {
FILE: pkg/rancher-desktop/main/networking/linux-ca.ts
function getCertificate (line 55) | async function getCertificate(certURL: string): Promise<string | undefin...
FILE: pkg/rancher-desktop/main/networking/proxy.ts
class ElectronProxyAgent (line 8) | class ElectronProxyAgent extends ProxyAgent {
method constructor (line 9) | constructor(options?: ProxyAgentOptions) {
method getProxyForUrlElectron (line 20) | async getProxyForUrlElectron(url: string): Promise<string> {
FILE: pkg/rancher-desktop/main/serverHelper.ts
function basicAuth (line 7) | function basicAuth(userdb: Record<string, string>, authString: string): ...
function base64Decode (line 36) | function base64Decode(value: string): string {
function getRequestBody (line 49) | async function getRequestBody(request: http.IncomingMessage, maxPayloadS...
function randomStr (line 78) | function randomStr(length = 16) {
FILE: pkg/rancher-desktop/main/snapshots/snapshots.ts
function parseLines (line 12) | function parseLines(line: string): string[] {
class SnapshotsError (line 16) | class SnapshotsError {
method constructor (line 20) | constructor(args: string[], response: SpawnResult) {
class SnapshotsImpl (line 39) | class SnapshotsImpl {
method rdctl (line 40) | private async rdctl(commandArgs: string[]): Promise<SpawnResult> {
method list (line 52) | async list(): Promise<Snapshot[]> {
method create (line 64) | async create(snapshot: Snapshot) : Promise<void> {
method restore (line 83) | async restore(name: string) : Promise<void> {
method delete (line 92) | async delete(name: string) : Promise<void> {
method cancel (line 101) | async cancel() {
FILE: pkg/rancher-desktop/main/snapshots/types.ts
type SnapshotEvent (line 1) | interface SnapshotEvent {
type SpawnResult (line 9) | interface SpawnResult {
type SnapshotDialog (line 15) | interface SnapshotDialog {
type Snapshot (line 26) | interface Snapshot {
FILE: pkg/rancher-desktop/main/tray.ts
class Tray (line 31) | class Tray {
method click (line 70) | click() {
method watchForChanges (line 133) | private async watchForChanges() {
method constructor (line 165) | private constructor(settings: Settings) {
method getInstance (line 244) | public static getInstance(settings: Settings): Tray {
method hide (line 253) | public hide() {
method show (line 272) | public show() {
method handleUpdateNetworkStatus (line 278) | protected async handleUpdateNetworkStatus(status: boolean) {
method buildFromConfig (line 289) | protected buildFromConfig() {
method backendStateChanged (line 300) | protected backendStateChanged(backendIsLocked: string) {
method k8sStateChanged (line 309) | protected k8sStateChanged(state: State) {
method settingsChanged (line 317) | protected settingsChanged() {
method updateMenu (line 321) | protected updateMenu() {
method updateContexts (line 394) | protected updateContexts() {
method contextClick (line 427) | protected contextClick(menuItem: Electron.MenuItem) {
FILE: pkg/rancher-desktop/main/update/LonghornProvider.ts
type LonghornProviderOptions (line 24) | interface LonghornProviderOptions extends CustomPublishOptions {
type LonghornUpdateInfo (line 49) | interface LonghornUpdateInfo extends UpdateInfo {
type LonghornUpgraderResponse (line 66) | interface LonghornUpgraderResponse {
type UpgradeResponderVersion (line 74) | interface UpgradeResponderVersion {
type UpgradeResponderQueryResult (line 81) | interface UpgradeResponderQueryResult {
type UpgradeResponderRequestPayload (line 87) | interface UpgradeResponderRequestPayload {
type GitHubReleaseAsset (line 96) | interface GitHubReleaseAsset {
type GitHubReleaseInfo (line 110) | interface GitHubReleaseInfo {
type LonghornCache (line 129) | interface LonghornCache {
function hasQueuedUpdate (line 159) | async function hasQueuedUpdate(): Promise<boolean> {
function setHasQueuedUpdate (line 196) | async function setHasQueuedUpdate(isQueued: boolean): Promise<void> {
function getPlatformVersion (line 217) | function getPlatformVersion(): string {
function getWslVersionString (line 241) | async function getWslVersionString(): Promise<string | undefined> {
function queryUpgradeResponder (line 262) | async function queryUpgradeResponder(url: string, currentVersion: semver...
class LonghornProvider (line 330) | class LonghornProvider extends Provider<LonghornUpdateInfo> {
method constructor (line 331) | constructor(
method getSha512Sum (line 348) | protected async getSha512Sum(checksumURL: string): Promise<string> {
method checkForUpdates (line 359) | protected async checkForUpdates(): Promise<LonghornCache> {
method getLatestVersion (line 451) | async getLatestVersion(): Promise<LonghornUpdateInfo> {
method resolveFiles (line 472) | resolveFiles(updateInfo: UpdateInfo): ResolvedUpdateFileInfo[] {
FILE: pkg/rancher-desktop/main/update/MSIUpdater.ts
class MsiUpdater (line 24) | class MsiUpdater extends NsisUpdater {
method constructor (line 26) | constructor(options?: AllPublishOptions | null, app?: AppAdapter) {
method doDownloadUpdate (line 31) | protected doDownloadUpdate(downloadUpdateOptions: DownloadUpdateOption...
method verifySignature_ (line 67) | private async verifySignature_(destinationFile: string): Promise<strin...
method doInstall (line 88) | protected doInstall(options: InstallOptions): boolean {
method shouldElevate (line 142) | protected get shouldElevate(): boolean {
FILE: pkg/rancher-desktop/main/update/index.ts
type State (line 28) | enum State {
type UpdateState (line 52) | interface UpdateState {
function isLonghornUpdateInfo (line 75) | function isLonghornUpdateInfo(info: UpdateInfo | LonghornUpdateInfo): in...
function getUpdater (line 83) | async function getUpdater(): Promise<AppUpdater | undefined> {
function setupUpdate (line 213) | async function setupUpdate(enabled: boolean, doInstall = false): Promise...
function doInitialUpdateCheck (line 260) | async function doInitialUpdateCheck(doInstall = false): Promise<boolean> {
function triggerUpdateCheck (line 290) | async function triggerUpdateCheck() {
FILE: pkg/rancher-desktop/mixins/compact-input.ts
method isCompact (line 19) | isCompact(): boolean {
FILE: pkg/rancher-desktop/mixins/labeled-form-element.ts
type LabeledFormElement (line 4) | interface LabeledFormElement {
method data (line 97) | data(): LabeledFormElement {
method requiredField (line 106) | requiredField(): boolean {
method empty (line 110) | empty(): boolean {
method isView (line 114) | isView(): boolean {
method isDisabled (line 118) | isDisabled(): boolean {
method isSearchable (line 122) | isSearchable(): boolean {
method isFilterable (line 137) | isFilterable(): boolean {
method validationMessage (line 147) | validationMessage(): string | undefined {
method resizeHandler (line 183) | resizeHandler() {
method onFocus (line 196) | onFocus() {
method onFocusLabeled (line 202) | onFocusLabeled() {
method onBlur (line 207) | onBlur() {
method onBlurLabeled (line 213) | onBlurLabeled() {
FILE: pkg/rancher-desktop/mixins/vue-select-overrides.js
method mappedKeys (line 3) | mappedKeys(map, vm) {
FILE: pkg/rancher-desktop/plugins/clean-html-directive.js
constant ALLOWED_TAGS (line 3) | const ALLOWED_TAGS = [
method install (line 23) | install(app) {
FILE: pkg/rancher-desktop/plugins/clean-tooltip-directive.ts
constant ALLOWED_TAGS (line 5) | const ALLOWED_TAGS = [
method install (line 23) | install(app: App, ..._options: any) {
FILE: pkg/rancher-desktop/plugins/directives.js
method install (line 3) | install(app) {
FILE: pkg/rancher-desktop/plugins/i18n.js
function stringFor (line 6) | function stringFor(store, key, args, raw = false, escapehtml = true) {
function directive (line 31) | function directive(el, binding, vnode /*, oldVnode */) {
function directiveSsr (line 43) | function directiveSsr(vnode, binding) {
method beforeMount (line 71) | beforeMount() {
method updated (line 74) | updated() {
method setup (line 101) | setup(props, ctx) {
method render (line 112) | render() {
FILE: pkg/rancher-desktop/plugins/tooltip.ts
method install (line 6) | install(app: App, ..._options: any) {
FILE: pkg/rancher-desktop/plugins/trim-whitespace.js
function trimWhitespace (line 1) | function trimWhitespace(el, dir) {
method install (line 17) | install(app) {
FILE: pkg/rancher-desktop/plugins/v-select.js
method install (line 5) | install(app) {
FILE: pkg/rancher-desktop/preload/extensions.ts
type DockerListContainersOptions (line 25) | interface DockerListContainersOptions {
type DockerListImagesOptions (line 37) | interface DockerListImagesOptions {
type DockerListVolumesOptions (line 48) | interface DockerListVolumesOptions {
type DockerEventCallback (line 56) | type DockerEventCallback = (event: DockerEvent) => void;
type DockerEvent (line 61) | interface DockerEvent {
type DockerEventSubscriptionOptions (line 78) | interface DockerEventSubscriptionOptions {
type DockerEventSubscription (line 91) | interface DockerEventSubscription {
type execProcess (line 96) | interface execProcess {
type RDXExecOptions (line 104) | interface RDXExecOptions extends v1.ExecOptions {
type RDXSpawnOptions (line 108) | interface RDXSpawnOptions extends v1.SpawnOptions {
function getTypeErrorMessage (line 152) | function getTypeErrorMessage(name: string, expectedType: string, object:...
function isSpawnOptions (line 167) | function isSpawnOptions(options: RDXExecOptions | RDXSpawnOptions): opti...
function getExec (line 175) | function getExec(scope: SpawnOptions['scope']): v1.Exec {
function getProcess (line 296) | function getProcess(id: string, reason: string): execProcess | undefined {
class RDXClient (line 373) | class RDXClient implements v1.DockerDesktopClient {
method constructor (line 374) | constructor(info?: { arch: string, hostname: string }) {
method makeRequest (line 384) | protected makeRequest(method: string, url: string, data?: any): Promis...
method request (line 398) | protected async request(config: v1.RequestConfig): Promise<unknown> {
method showOpenDialog (line 449) | showOpenDialog(options: any): Promise<v1.OpenDialogResult> {
method success (line 457) | success(msg: string) {
method warning (line 460) | warning(msg: string) {
method error (line 463) | error(msg: string) {
method pick (line 536) | function pick<K extends string | readonly [string, string]>(object: an...
function initExtensions (line 719) | function initExtensions(): void {
FILE: pkg/rancher-desktop/preload/index.ts
function init (line 3) | function init() {
FILE: pkg/rancher-desktop/product.js
constant NAME (line 1) | const NAME = 'rancher-desktop';
function init (line 3) | function init(plugin, store) {
FILE: pkg/rancher-desktop/store/action-menu.js
method options (line 32) | options(state) {
method show (line 64) | show(state, { resources, elem, event }) {
method hide (line 75) | hide(state) {
method togglePromptRemove (line 81) | togglePromptRemove(state, resources) {
method togglePromptMove (line 94) | togglePromptMove(state, resources) {
method togglePromptRestore (line 104) | togglePromptRestore(state, resources) {
method toggleAssignTo (line 117) | toggleAssignTo(state, resources) {
method togglePromptUpdate (line 127) | togglePromptUpdate(state, resources) {
method togglePromptModal (line 142) | togglePromptModal(state, data) {
method executeTable (line 155) | executeTable({ state }, { action, args }) {
method execute (line 159) | execute({ state }, { action, args, opts }) {
function _add (line 168) | function _add(map, act, incrementCounts = true) {
function _filter (line 198) | function _filter(map, disableAll = false) {
function _execute (line 212) | function _execute(resources, action, args, opts = {}) {
FILE: pkg/rancher-desktop/store/applicationSettings.ts
type State (line 13) | interface State {
method SET_PATH_MANAGEMENT_STRATEGY (line 26) | SET_PATH_MANAGEMENT_STRATEGY(state: State, strategy: PathManagementStrat...
method setPathManagementStrategy (line 32) | setPathManagementStrategy({ commit }, strategy: PathManagementStrategy) {
method commitPathManagementStrategy (line 35) | async commitPathManagementStrategy({ commit }, strategy: PathManagementS...
method pathManagementStrategy (line 43) | pathManagementStrategy({ pathManagementStrategy }: State) {
FILE: pkg/rancher-desktop/store/container-engine.ts
type ValidContainerEngine (line 9) | type ValidContainerEngine = Exclude<ContainerEngine, ContainerEngine.NONE>;
type SubscriberType (line 10) | type SubscriberType = 'containers' | 'volumes';
type ErrorSource (line 11) | type ErrorSource = 'containers' | 'volumes' | 'namespaces';
type ApiContainer (line 16) | interface ApiContainer {
type MobyContainer (line 44) | interface MobyContainer extends ApiContainer {
type NerdctlContainer (line 54) | interface NerdctlContainer extends ApiContainer {
type Container (line 63) | interface Container {
type Volume (line 74) | interface Volume {
class Subscriber (line 89) | class Subscriber {
method destroy (line 91) | destroy() {
type SubscriberConstructor (line 96) | type SubscriberConstructor =
class MobyContainerSubscriber (line 99) | class MobyContainerSubscriber extends Subscriber {
method constructor (line 100) | constructor(client: RDXClient, dispatch: Dispatch) {
class MobyVolumeSubscriber (line 113) | class MobyVolumeSubscriber extends Subscriber {
method constructor (line 114) | constructor(client: RDXClient, dispatch: Dispatch) {
class NerdctlContainerSubscriber (line 127) | class NerdctlContainerSubscriber extends Subscriber {
method constructor (line 128) | constructor(client: RDXClient, dispatch: Dispatch, namespace?: string) {
class NerdctlVolumeSubscriber (line 145) | class NerdctlVolumeSubscriber extends Subscriber {
method constructor (line 147) | constructor(client: RDXClient, dispatch: Dispatch, namespace?: string) {
method destroy (line 165) | override destroy() {
function subscriberConstructor (line 171) | function subscriberConstructor(backend: ValidContainerEngine, type: Subs...
type ContainersState (line 180) | interface ContainersState {
type BulkParams (line 207) | type BulkParams = Pick<ContainersState, 'backend' | 'type' | 'client' | ...
method SET_SUBSCRIBER (line 210) | SET_SUBSCRIBER(state, subscriber) {
method SET_NAMESPACES (line 214) | SET_NAMESPACES(state, namespaces) {
method SET_CONTAINERS (line 217) | SET_CONTAINERS(state, containers) {
method SET_VOLUMES (line 220) | SET_VOLUMES(state, volumes) {
method SET_ERROR (line 223) | SET_ERROR(state, error) {
method SET_PARAMS (line 226) | SET_PARAMS(state, params: BulkParams) {
type SubscribeParams (line 249) | type SubscribeParams = Omit<BulkParams, 'backend' | 'namespace'> & Parti...
method subscribe (line 252) | async subscribe({ commit, state, dispatch, getters }, params: SubscribeP...
method unsubscribe (line 272) | unsubscribe({ commit, state }) {
method fetchNamespaces (line 279) | async fetchNamespaces({ commit, state, getters }) {
method fetchContainers (line 296) | async fetchContainers({ commit, getters, state }) {
method fetchVolumes (line 354) | async fetchVolumes({ commit, getters, state }) {
method backend (line 383) | backend(_state, _getters, rootState): ContainerEngine {
method supportsNamespaces (line 386) | supportsNamespaces(state) {
method namespace (line 389) | namespace(_state, _getters, rootState): string | undefined {
method error (line 392) | error(state) {
FILE: pkg/rancher-desktop/store/credentials.ts
type Credentials (line 9) | type Credentials = Omit<ServerState, 'pid'>;
type CredentialsState (line 11) | interface CredentialsState {
function fetchAPI (line 17) | async function fetchAPI(api: string, rootState: any, init?: RequestInit) {
method SET_CREDENTIALS (line 47) | SET_CREDENTIALS(state, credentials) {
method fetchCredentials (line 54) | async fetchCredentials({ commit }): Promise<Credentials> {
FILE: pkg/rancher-desktop/store/diagnostics.ts
type DiagnosticsState (line 12) | interface DiagnosticsState {
function mapMutedDiagnostics (line 27) | function mapMutedDiagnostics(checks: DiagnosticsResult[], mutedChecks: R...
function mapMarkdownToDiagnostics (line 38) | async function mapMarkdownToDiagnostics(diagnostics: DiagnosticsResult[]) {
function markdown (line 56) | async function markdown(raw: string) {
method SET_DIAGNOSTICS (line 71) | SET_DIAGNOSTICS(state: DiagnosticsState, diagnostics: DiagnosticsResult[...
method SET_TIME_LAST_RUN (line 75) | SET_TIME_LAST_RUN(state: DiagnosticsState, currentDate: Date) {
method SET_IN_ERROR (line 78) | SET_IN_ERROR(state: DiagnosticsState, status: boolean) {
method fetchDiagnostics (line 84) | async fetchDiagnostics({ commit, rootState }) {
method runDiagnostics (line 115) | async runDiagnostics({ commit, rootState }) {
method updateDiagnostic (line 141) | async updateDiagnostic({
FILE: pkg/rancher-desktop/store/extensions.ts
type BackendExtensionState (line 15) | interface BackendExtensionState {
type ExtensionState (line 28) | type ExtensionState = BackendExtensionState & {
type ExtensionsState (line 37) | interface ExtensionsState {
type MarketplaceData (line 41) | interface MarketplaceData {
method SET_EXTENSIONS (line 55) | SET_EXTENSIONS(state, extensions: Record<string, ExtensionState>) {
method fetch (line 61) | async fetch({ commit, rootState }) {
method install (line 96) | async install({ rootState, dispatch }, { id }: { id: string }) {
method uninstall (line 113) | async uninstall({ rootState, dispatch }, { id }: { id: string }) {
method installedExtensions (line 127) | installedExtensions(state): ExtensionState[] {
method marketData (line 130) | marketData(): MarketplaceData[] {
FILE: pkg/rancher-desktop/store/i18n.js
constant NONE (line 10) | const NONE = 'none';
method selectedLocaleLabel (line 30) | selectedLocaleLabel(state) {
method availableLocales (line 40) | availableLocales(state, getters) {
method loadTranslations (line 152) | loadTranslations(state, { locale, translations }) {
method setSelected (line 156) | setSelected(state, locale) {
method init (line 162) | init({ state, commit, dispatch }) {
method load (line 172) | async load({ commit }, locale) {
method switchTo (line 180) | async switchTo({ state, commit, dispatch }, locale) {
method toggleNone (line 211) | toggleNone({ state, dispatch }) {
FILE: pkg/rancher-desktop/store/imageManager.ts
type ImageManagerState (line 5) | interface ImageManagerState {
method SET_IMAGE_MANAGER_STATE (line 12) | SET_IMAGE_MANAGER_STATE(state: ImageManagerState, imageManagerState: boo...
method setImageManagerState (line 18) | setImageManagerState({ commit }, imageManagerState: boolean) {
method getImageManagerState (line 24) | getImageManagerState({ imageManagerState }: ImageManagerState) {
FILE: pkg/rancher-desktop/store/k8sManager.js
method SET_K8S_STATE (line 7) | SET_K8S_STATE(state, k8sState) {
method setK8sState (line 13) | setK8sState({ commit }, k8sState) {
method getK8sState (line 19) | getK8sState({ k8sState }) {
method isReady (line 22) | isReady({ k8sState }) {
FILE: pkg/rancher-desktop/store/page.ts
type PageState (line 5) | interface PageState {
method SET_TITLE (line 20) | SET_TITLE(state, title) {
method SET_DESCRIPTION (line 23) | SET_DESCRIPTION(state, description) {
method SET_ACTION (line 26) | SET_ACTION(state, action) {
method SET_ICON (line 29) | SET_ICON(state, icon) {
method setHeader (line 35) | setHeader({ commit }, args: { title: string, description?: string, actio...
method setAction (line 45) | setAction({ commit }, args: { action: string }) {
FILE: pkg/rancher-desktop/store/preferences.ts
type Severities (line 12) | interface Severities {
type PreferencesState (line 18) | interface PreferencesState {
type Credentials (line 30) | type Credentials = Omit<ServerState, 'pid'>;
type CommitArgs (line 32) | interface CommitArgs {
method SET_PREFERENCES (line 94) | SET_PREFERENCES(state, preferences) {
method SET_INITIAL_PREFERENCES (line 98) | SET_INITIAL_PREFERENCES(state, preferences) {
method SET_LOCKED_PREFERENCES (line 101) | SET_LOCKED_PREFERENCES(state, preferences) {
method SET_WSL_INTEGRATIONS (line 104) | SET_WSL_INTEGRATIONS(state, integrations) {
method SET_IS_PLATFORM_WINDOWS (line 107) | SET_IS_PLATFORM_WINDOWS(state, isPlatformWindows) {
method SET_HAS_ERROR (line 110) | SET_HAS_ERROR(state, hasError) {
method SET_SEVERITIES (line 113) | SET_SEVERITIES(state, severities) {
method SET_PREFERENCES_ERROR (line 116) | SET_PREFERENCES_ERROR(state, error) {
method SET_CAN_APPLY (line 119) | SET_CAN_APPLY(state, canApply) {
type PrefActionContext (line 124) | type PrefActionContext = ActionContext<PreferencesState, typeof mutations>;
type ProposePreferencesPayload (line 125) | interface ProposePreferencesPayload { preferences?: Settings }
method setPreferences (line 128) | setPreferences({ commit }, preferences: Settings) {
method initializePreferences (line 131) | initializePreferences({ commit }, preferences: Settings) {
method fetchPreferences (line 135) | async fetchPreferences({ dispatch, commit, rootState }) {
method fetchLocked (line 157) | async fetchLocked({ commit, rootState }) {
method commitPreferences (line 179) | async commitPreferences({ dispatch, getters, rootState }, args: CommitAr...
method updatePreferencesData (line 204) | async updatePreferencesData<P extends RecursiveKeys<Settings>>({
method setWslIntegrations (line 217) | setWslIntegrations({ commit, state }, integrations: Record<string, strin...
method updateWslIntegrations (line 228) | updateWslIntegrations({ commit, state }, args: { distribution: string, v...
method setPlatformWindows (line 235) | setPlatformWindows({ commit }, isPlatformWindows: boolean) {
method proposePreferences (line 248) | async proposePreferences(
method setShowMuted (line 288) | async setShowMuted({ dispatch }, isMuted: boolean) {
method setCanApply (line 300) | setCanApply({ commit }, canApply: boolean) {
method getPreferences (line 306) | getPreferences(state) {
method isPreferencesDirty (line 309) | isPreferencesDirty(state) {
method getWslIntegrations (line 319) | getWslIntegrations(state) {
method isPlatformWindows (line 322) | isPlatformWindows(state) {
method hasError (line 325) | hasError(state) {
method canApply (line 328) | canApply(state, getters) {
method showMuted (line 331) | showMuted(state) {
FILE: pkg/rancher-desktop/store/prefs.js
method get (line 27) | get() {
method set (line 31) | set(value) {
constant CLUSTER (line 42) | const CLUSTER = create('cluster', '');
constant LAST_NAMESPACE (line 43) | const LAST_NAMESPACE = create('last-namespace', '');
constant NAMESPACE_FILTERS (line 44) | const NAMESPACE_FILTERS = create('ns', ['all://user'], { parseJSON });
constant WORKSPACE (line 45) | const WORKSPACE = create('workspace', '');
constant EXPANDED_GROUPS (line 46) | const EXPANDED_GROUPS = create('open-groups', ['cluster', 'rbac', 'servi...
constant FAVORITE_TYPES (line 47) | const FAVORITE_TYPES = create('fav-type', [], { parseJSON });
constant GROUP_RESOURCES (line 48) | const GROUP_RESOURCES = create('group-by', 'namespace');
constant DIFF (line 49) | const DIFF = create('diff', 'unified', { options: ['unified', 'split'] });
constant THEME (line 50) | const THEME = create('theme', 'auto', {
constant PREFERS_SCHEME (line 57) | const PREFERS_SCHEME = create('pcs', '', { asCookie, asUserPreference: f...
constant LOCALE (line 58) | const LOCALE = create('locale', 'en-us', { asCookie });
constant KEYMAP (line 59) | const KEYMAP = create('keymap', 'sublime', { options: ['sublime', 'emacs...
constant ROWS_PER_PAGE (line 60) | const ROWS_PER_PAGE = create('per-page', 100, { options: [10, 25, 50, 10...
constant LOGS_WRAP (line 61) | const LOGS_WRAP = create('logs-wrap', true, { parseJSON });
constant LOGS_TIME (line 62) | const LOGS_TIME = create('logs-time', true, { parseJSON });
constant LOGS_RANGE (line 63) | const LOGS_RANGE = create('logs-range', '30 minutes', { parseJSON });
constant HIDE_REPOS (line 64) | const HIDE_REPOS = create('hide-repos', [], { parseJSON });
constant HIDE_DESC (line 65) | const HIDE_DESC = create('hide-desc', [], { parseJSON });
constant HIDE_SENSITIVE (line 66) | const HIDE_SENSITIVE = create('hide-sensitive', true, { options: [true, ...
constant SHOW_PRE_RELEASE (line 67) | const SHOW_PRE_RELEASE = create('show-pre-release', false, { options: [f...
constant DATE_FORMAT (line 69) | const DATE_FORMAT = create('date-format', 'ddd, MMM D YYYY', {
constant TIME_FORMAT (line 79) | const TIME_FORMAT = create('time-format', 'h:mm:ss a', {
constant TIME_ZONE (line 86) | const TIME_ZONE = create('time-zone', 'local');
constant DEV (line 87) | const DEV = create('dev', false, { parseJSON });
constant LAST_VISITED (line 88) | const LAST_VISITED = create('last-visited', 'home', { parseJSON });
constant SEEN_WHATS_NEW (line 89) | const SEEN_WHATS_NEW = create('seen-whatsnew', '', { parseJSON });
constant READ_WHATS_NEW (line 90) | const READ_WHATS_NEW = create('read-whatsnew', '', { parseJSON });
constant AFTER_LOGIN_ROUTE (line 91) | const AFTER_LOGIN_ROUTE = create('after-login-route', 'home', { parseJSO...
constant HIDE_HOME_PAGE_CARDS (line 92) | const HIDE_HOME_PAGE_CARDS = create('home-page-cards', {}, { parseJSON } );
constant PROVISIONER (line 96) | const PROVISIONER = create('provisioner', _RKE2, { options: [_RKE1, _RKE...
constant CLUSTER_TOOLS_TIP (line 99) | const CLUSTER_TOOLS_TIP = create('hide-cluster-tools-tip', false, { pars...
constant MENU_MAX_CLUSTERS (line 102) | const MENU_MAX_CLUSTERS = create('menu-max-clusters', 4, { options: [2, ...
method load (line 219) | load(state, { key, value }) {
method cookiesLoaded (line 223) | cookiesLoaded(state) {
method set (line 229) | async set({ dispatch, commit }, opt) {
method setTheme (line 271) | async setTheme({ dispatch }, val) {
method loadCookies (line 275) | loadCookies({ state, commit }) {
method loadTheme (line 298) | loadTheme({ state, dispatch }) {
method loadServer (line 355) | async loadServer({ state, dispatch, commit }, ignoreKey) {
method setLastVisited (line 405) | setLastVisited({ state, dispatch }, route) {
method toggleTheme (line 415) | toggleTheme({ getters, dispatch }) {
function getLoginRoute (line 422) | function getLoginRoute(route) {
FILE: pkg/rancher-desktop/store/resource-fetch.js
method updateIsTooManyItems (line 16) | updateIsTooManyItems(state, data) {
method updateRefreshFlag (line 19) | updateRefreshFlag(state, data) {
method updateManualRefreshIsLoading (line 22) | updateManualRefreshIsLoading(state, data) {
method clearData (line 28) | clearData({ commit, state }) {
method updateIsTooManyItems (line 32) | updateIsTooManyItems({ commit }, data) {
method updateManualRefreshIsLoading (line 35) | updateManualRefreshIsLoading({ commit }, data) {
method doManualRefresh (line 38) | doManualRefresh({ commit, dispatch, state }) {
FILE: pkg/rancher-desktop/store/snapshots.ts
type SnapshotsState (line 8) | interface SnapshotsState {
method SET_SNAPSHOTS (line 15) | SET_SNAPSHOTS(state: SnapshotsState, snapshots: Snapshot[]) {
method fetch (line 21) | async fetch({ commit, rootState }) {
method create (line 36) | async create({ rootState, dispatch }, snapshot: Snapshot) {
method delete (line 52) | async delete({ rootState, dispatch }, name: string) {
method restore (line 66) | async restore({ rootState }, name: string) {
method list (line 80) | list(state: SnapshotsState) {
FILE: pkg/rancher-desktop/store/transientSettings.ts
type Preferences (line 12) | type Preferences = typeof defaultTransientSettings.preferences;
type CommitArgs (line 14) | interface CommitArgs {
type NavigatePrefsDialogArgs (line 18) | interface NavigatePrefsDialogArgs extends ServerState {
type ExtendedTransientSettings (line 23) | type ExtendedTransientSettings = TransientSettings & {
method SET_PREFERENCES (line 33) | SET_PREFERENCES(state, preferences) {
method SET_NO_MODAL_DIALOGS (line 36) | SET_NO_MODAL_DIALOGS(state, noModalDialogs) {
method SET_MAC_OS_VERSION (line 39) | SET_MAC_OS_VERSION(state, macOsVersion) {
method SET_IS_ARM (line 42) | SET_IS_ARM(state, isArm) {
method setPreferences (line 48) | setPreferences({ commit }, preferences: Preferences) {
method fetchTransientSettings (line 51) | async fetchTransientSettings({ commit, rootState }) {
method commitPreferences (line 66) | async commitPreferences({ state, dispatch, rootState }, args: CommitArgs) {
method navigatePrefDialog (line 83) | async navigatePrefDialog(context, args: NavigatePrefsDialogArgs) {
method setMacOsVersion (line 90) | setMacOsVersion({ commit }, macOsVersion: semver.SemVer) {
method setIsArm (line 93) | setIsArm({ commit }, isArm: boolean) {
method getPreferences (line 99) | getPreferences(state: TransientSettings) {
method getNoModalDialogs (line 102) | getNoModalDialogs(state: TransientSettings) {
method getCurrentNavItem (line 105) | getCurrentNavItem(state: TransientSettings) {
method getActiveTab (line 108) | getActiveTab(state: TransientSettings) {
FILE: pkg/rancher-desktop/store/ts-helpers.ts
type MutationsType (line 11) | type MutationsType<T> = {
type MutationsPayloadType (line 19) | type MutationsPayloadType<M> = {
type ActionContext (line 28) | interface ActionContext<S, M = MutationsType<S>, G = GetterTree<S, any>> {
type ActionHandler (line 40) | type ActionHandler<S, R, M, G> = (this: Store<R>, context: ActionContext...
type ActionObject (line 41) | interface ActionObject<S, R, M, G> {
type Action (line 45) | type Action<S, R, M, G> = ActionHandler<S, R, M, G> | ActionObject<S, R,...
type ActionTree (line 47) | type ActionTree<
FILE: pkg/rancher-desktop/sudo-prompt/index.js
function Attempt (line 12) | function Attempt(instance, end) {
function EscapeDoubleQuotes (line 27) | function EscapeDoubleQuotes(string) {
function Exec (line 35) | function Exec() {
function Linux (line 146) | function Linux(instance, end) {
function LinuxBinary (line 224) | function LinuxBinary(_, end) {
function Mac (line 255) | function Mac(instance, callback) {
function MacCommand (line 315) | function MacCommand(instance, end) {
function MacOpen (line 334) | function MacOpen(instance, end) {
function MacResult (line 361) | function MacResult(instance, end) {
function Remove (line 399) | function Remove(path, end) {
function UUID (line 419) | function UUID(instance, end) {
function ValidName (line 442) | function ValidName(string) {
function Windows (line 455) | function Windows(instance, callback) {
function WindowsElevate (line 534) | function WindowsElevate(instance, end) {
function WindowsResult (line 567) | function WindowsResult(instance, end) {
function WindowsWaitForStatus (line 601) | function WindowsWaitForStatus(instance, end) {
function WindowsWriteCommandScript (line 639) | function WindowsWriteCommandScript(instance, end) {
function WindowsWriteExecuteScript (line 673) | function WindowsWriteExecuteScript(instance, end) {
constant PERMISSION_DENIED (line 688) | const PERMISSION_DENIED = 'User did not grant permission.';
constant NO_POLKIT_AGENT (line 689) | const NO_POLKIT_AGENT = 'No polkit authentication agent found.';
constant MAX_BUFFER (line 692) | const MAX_BUFFER = 134217728;
FILE: pkg/rancher-desktop/sudo-prompt/test-concurrent.js
function kill (line 5) | function kill(end) {
FILE: pkg/rancher-desktop/sudo-prompt/test.js
function kill (line 7) | function kill(end) {
function icns (line 14) | function icns() {
FILE: pkg/rancher-desktop/types/components/labeledSelect.ts
constant LABEL_SELECT_KINDS (line 1) | const LABEL_SELECT_KINDS = {
constant LABEL_SELECT_NOT_OPTION_KINDS (line 7) | const LABEL_SELECT_NOT_OPTION_KINDS = [
type LabelSelectPaginateFnOptions (line 15) | interface LabelSelectPaginateFnOptions<T = any> {
type LabelSelectPaginateFnResponse (line 41) | interface LabelSelectPaginateFnResponse<T = any> {
type LabelSelectPaginateFn (line 50) | type LabelSelectPaginateFn<T = any> = (opts: LabelSelectPaginateFnOption...
FILE: pkg/rancher-desktop/typings/electron-ipc.d.ts
type IpcMainEvents (line 15) | interface IpcMainEvents {
type IpcMainInvokeEvents (line 123) | interface IpcMainInvokeEvents {
type IpcRendererEvents (line 167) | interface IpcRendererEvents {
FILE: pkg/rancher-desktop/typings/rdx.d.ts
type Window (line 4) | interface Window {
type ExecOptions (line 10) | interface ExecOptions {
FILE: pkg/rancher-desktop/typings/shell.d.ts
class IPlugin (line 2) | class IPlugin {
FILE: pkg/rancher-desktop/typings/store.d.ts
type Actions (line 5) | type Actions<
type Keys (line 13) | type Keys<T> = T extends Record<infer K, any> ? K : never;
type Values (line 14) | type Values<T> = T extends Record<any, infer V> ? V : never;
type Intersect (line 15) | type Intersect<U extends object> = {
type storeActions (line 19) | type storeActions = Intersect<Values<{
type Mutations (line 25) | type Mutations<
type storeMutations (line 33) | type storeMutations = Intersect<Values<{
type Dispatch (line 40) | interface Dispatch {
type Commit (line 54) | interface Commit {
type ComponentCustomProperties (line 74) | interface ComponentCustomProperties {
FILE: pkg/rancher-desktop/typings/unix.interface.ts
type UnixError (line 1) | interface UnixError {
type NodeError (line 15) | interface NodeError {
FILE: pkg/rancher-desktop/typings/vue-i18n.ts
type ComponentCustomProperties (line 6) | interface ComponentCustomProperties {
FILE: pkg/rancher-desktop/utils/DownloadProgressListener.ts
class DownloadProgressListener (line 6) | class DownloadProgressListener extends stream.Transform {
method constructor (line 16) | constructor(status: { current: number }, options: stream.TransformOpti...
method _transform (line 21) | _transform(chunk: any, encoding: string, callback: stream.TransformCal...
FILE: pkg/rancher-desktop/utils/__tests__/childProcess.spec.ts
function makeArg (line 10) | function makeArg(fn: () => void) {
FILE: pkg/rancher-desktop/utils/__tests__/paths.spec.ts
constant RESOURCES_PATH (line 8) | const RESOURCES_PATH = path.join(process.cwd(), 'resources');
type Platform (line 10) | type Platform = 'darwin' | 'linux' | 'win32';
type expectedData (line 11) | type expectedData = Record<Platform, string | Error>;
FILE: pkg/rancher-desktop/utils/__tests__/safeRename.spec.ts
function fileExists (line 38) | function fileExists(path: string) {
FILE: pkg/rancher-desktop/utils/array.ts
function removeObject (line 5) | function removeObject<T>(ary: T[], obj: T): T[] {
function removeObjects (line 15) | function removeObjects<T>(ary: T[], objs: T[]): T[] {
function addObject (line 62) | function addObject<T>(ary: T[], obj: T): void {
function addObjects (line 70) | function addObjects<T>(ary: T[], objs: T[]): void {
function insertAt (line 82) | function insertAt<T>(ary: T[], idx: number, ...objs: T[]): void {
function isArray (line 86) | function isArray<T>(thing: T[] | T): thing is T[] {
function toArray (line 90) | function toArray<T>(thing: T[] | T): T[] {
function removeAt (line 94) | function removeAt<T>(ary: T[], idx: number, length = 1): T[] {
function clear (line 108) | function clear<T>(ary: T[]): void {
function replaceWith (line 112) | function replaceWith<T>(ary: T[], ...values: T[]): void {
function findOrFilterBy (line 122) | function findOrFilterBy<T, K, V>(
function filterBy (line 151) | function filterBy<T, K, V>(
function findBy (line 157) | function findBy<T, K, V>(
function findStringIndex (line 163) | function findStringIndex(items: string[], item: string, trim = true): nu...
function hasDuplicatedStrings (line 167) | function hasDuplicatedStrings(items: string[], caseSensitive = true): bo...
function sameContents (line 184) | function sameContents<T>(aryA: T[], aryB: T[]): boolean {
function sameArrayObjects (line 188) | function sameArrayObjects<T>(aryA: T[], aryB: T[], positionAgnostic = fa...
function uniq (line 227) | function uniq<T>(ary: T[]): T[] {
function concatStrings (line 235) | function concatStrings(a: string[], b: string[]): string[] {
type KubeResource (line 239) | interface KubeResource { metadata: { labels: Record<string, string> } }
function getUniqueLabelKeys (line 240) | function getUniqueLabelKeys<T extends KubeResource>(aryResources: T[]): ...
FILE: pkg/rancher-desktop/utils/backgroundProcess.ts
type BackgroundProcessConstructorOptions (line 9) | interface BackgroundProcessConstructorOptions {
class BackgroundProcess (line 22) | class BackgroundProcess {
method constructor (line 57) | constructor(name: string, options: BackgroundProcessConstructorOptions) {
method start (line 74) | start() {
method shouldRun (line 82) | protected async shouldRun() {
method isRunning (line 89) | protected isRunning() {
method restart (line 96) | protected async restart() {
method stop (line 151) | async stop() {
FILE: pkg/rancher-desktop/utils/childProcess.ts
type SpawnOptionsWithStdioLog (line 17) | interface SpawnOptionsWithStdioLog<
type SpawnOptionsEncoding (line 23) | interface SpawnOptionsEncoding {
class SpawnError (line 31) | class SpawnError extends Error {
method constructor (line 32) | constructor(command: string[], options: { code: number | null, signal:...
method toString (line 57) | toString() {
type StdioElementType (line 85) | type StdioElementType = IOType | stream.Stream | Log | number | null | u...
type StdioOptionsLog (line 87) | type StdioOptionsLog = IOType | Log | StdioElementType[];
type CommonSpawnOptionsLog (line 89) | interface CommonSpawnOptionsLog extends CommonOptions, MessagingOptions {
type SpawnOptionsLog (line 96) | interface SpawnOptionsLog extends CommonSpawnOptionsLog {
type StdioNullLog (line 100) | type StdioNullLog = StdioNull | Log;
type SpawnOptionsWithStdioTuple (line 102) | interface SpawnOptionsWithStdioTuple<
function isLog (line 110) | function isLog(it: StdioElementType): it is Log {
function spawnFile (line 186) | async function spawnFile(
FILE: pkg/rancher-desktop/utils/clone.ts
function clone (line 7) | function clone<T>(input: T): T {
FILE: pkg/rancher-desktop/utils/commandLine.ts
function getCommandLineArgs (line 25) | function getCommandLineArgs(): string[] {
FILE: pkg/rancher-desktop/utils/dateUtils.ts
function currentTime (line 3) | function currentTime(): string {
FILE: pkg/rancher-desktop/utils/dockerDirManager.ts
type AuthConfig (line 20) | interface AuthConfig {
type PartialDockerConfig (line 33) | interface PartialDockerConfig {
class DockerDirManager (line 44) | class DockerDirManager {
method constructor (line 60) | constructor(dockerDirPath: string) {
method readDockerConfig (line 72) | protected async readDockerConfig(): Promise<PartialDockerConfig> {
method writeDockerConfig (line 91) | protected async writeDockerConfig(config: PartialDockerConfig): Promis...
method getCurrentDockerSocket (line 105) | protected async getCurrentDockerSocket(currentContext?: string): Promi...
method getDesiredDockerContext (line 147) | async getDesiredDockerContext(weOwnDefaultSocket: boolean, currentCont...
method spawnFileWithExtraPath (line 186) | protected async spawnFileWithExtraPath(command: string, args: string[]) {
method credHelperPassInitialized (line 206) | protected async credHelperPassInitialized(): Promise<boolean> {
method credHelperWorking (line 231) | protected async credHelperWorking(helperName: string): Promise<boolean> {
method getCredsStoreFor (line 264) | protected async getCredsStoreFor(currentCredsStore: string | undefined...
method ensureDockerContextFile (line 301) | protected async ensureDockerContextFile(socketPath: string): Promise<v...
method currentDockerContext (line 325) | get currentDockerContext(): Promise<string | undefined> {
method clearDockerContext (line 332) | async clearDockerContext(): Promise<void> {
method ensureDockerContextConfigured (line 357) | async ensureDockerContextConfigured(weOwnDefaultSocket: boolean, socke...
method ensureCredHelperConfigured (line 384) | async ensureCredHelperConfigured(): Promise<void> {
FILE: pkg/rancher-desktop/utils/dockerUtils.ts
class imageInfo (line 6) | class imageInfo {
method constructor (line 20) | constructor(registry: URL, name: string, tag?: string) {
method equalName (line 29) | equalName(other?: imageInfo | null): boolean {
function makeRE (line 39) | function makeRE(strings: TemplateStringsArray, ...substitutions: any[]) {
function parseImageReference (line 118) | function parseImageReference(reference: string, prefix = false): imageIn...
function validateImageName (line 152) | function validateImageName(name: string): boolean {
function validateImageTag (line 159) | function validateImageTag(tag: string): boolean {
FILE: pkg/rancher-desktop/utils/dom.js
function getParent (line 1) | function getParent(el, parentSelector) {
FILE: pkg/rancher-desktop/utils/eventEmitter.ts
type EventEmitter (line 7) | interface EventEmitter<T extends { [P in keyof T]: (...args: any) => voi...
FILE: pkg/rancher-desktop/utils/filters.ts
function arrayCustomizer (line 10) | function arrayCustomizer(objValue: any, srcValue: any) {
FILE: pkg/rancher-desktop/utils/imageOutputCuller.ts
type ImageOutputCuller (line 5) | interface ImageOutputCuller {
function getImageOutputCuller (line 15) | function getImageOutputCuller(command: string) {
FILE: pkg/rancher-desktop/utils/ipcRenderer.ts
type IpcRenderer (line 9) | interface IpcRenderer {
FILE: pkg/rancher-desktop/utils/iterator.ts
class AsyncCallbackIterator (line 34) | class AsyncCallbackIterator<T> implements AsyncIterableIterator<T> {
method constructor (line 44) | constructor() {
method emit (line 58) | async emit(item: T) {
method error (line 73) | async error(reason?: any) {
method end (line 88) | end() {
method next (line 99) | async next(): Promise<IteratorResult<T, undefined>> {
method [Symbol.asyncIterator] (line 92) | [Symbol.asyncIterator]() {
FILE: pkg/rancher-desktop/utils/kubeVersions.ts
type VersionEntry (line 3) | interface VersionEntry {
class SemanticVersionEntry (line 21) | class SemanticVersionEntry implements Omit<VersionEntry, 'version'> {
method constructor (line 29) | constructor(version: semver.SemVer, channels?: string[]) {
method versionEntry (line 34) | get versionEntry(): VersionEntry {
function highestStableVersion (line 47) | function highestStableVersion(versions: VersionEntry[]): VersionEntry | ...
function sameMajorMinorVersion (line 53) | function sameMajorMinorVersion(version1: semver.SemVer, version2: semver...
function minimumUpgradeVersion (line 62) | function minimumUpgradeVersion(versions: SemanticVersionEntry[]): Semant...
FILE: pkg/rancher-desktop/utils/latch.ts
type Latch (line 7) | interface Latch extends Promise<void> {
function Latch (line 18) | function Latch(): Latch {
FILE: pkg/rancher-desktop/utils/logging.ts
type consoleKey (line 29) | type consoleKey = 'log' | 'error' | 'info' | 'warn';
type logLevel (line 30) | type logLevel = 'debug' | 'info';
constant LOG_LEVEL (line 32) | let LOG_LEVEL: logLevel = 'info';
function setLogLevel (line 34) | function setLogLevel(level: logLevel): void {
class Log (line 38) | class Log {
method constructor (line 39) | constructor(topic: string, directory = paths.logs) {
method stream (line 56) | get stream(): fs.WriteStream {
method reopen (line 71) | protected reopen(mode = 'w') {
method fdStream (line 102) | get fdStream(): Promise<stream.Writable> {
method log (line 119) | log(message: any, ...optionalParameters: any[]) {
method error (line 124) | error(message: any, ...optionalParameters: any[]) {
method info (line 129) | info(message: any, ...optionalParameters: any[]) {
method warn (line 134) | warn(message: any, ...optionalParameters: any[]) {
method debug (line 141) | debug(data: any, ...args: any[]) {
method debugE (line 152) | debugE(message: string, exception: any) {
method logWithDate (line 160) | protected logWithDate(method: consoleKey, message: any, optionalParame...
method sync (line 164) | async sync() {
type Module (line 169) | type Module = Record<string, Log>;
function clearLoggingDirectory (line 197) | function clearLoggingDirectory(): void {
function reopenLogs (line 221) | function reopenLogs() {
FILE: pkg/rancher-desktop/utils/networks.ts
type networkStatus (line 3) | enum networkStatus {
function wslHostIPv4Address (line 9) | function wslHostIPv4Address(): string | undefined {
FILE: pkg/rancher-desktop/utils/object.js
function set (line 14) | function set(obj, path, value) {
function getAllValues (line 39) | function getAllValues(obj, path) {
function get (line 58) | function get(obj, path) {
function remove (line 92) | function remove(obj, path) {
function deleteProperty (line 119) | function deleteProperty(obj, path) {
function getter (line 127) | function getter(path) {
function clone (line 133) | function clone(obj) {
function isEmpty (line 137) | function isEmpty(obj) {
function isSimpleKeyValue (line 150) | function isSimpleKeyValue(obj) {
function cleanUp (line 164) | function cleanUp(obj) {
function definedKeys (line 190) | function definedKeys(obj) {
function diff (line 207) | function diff(from, to) {
function isEqualBasic (line 247) | function isEqualBasic(from, to) {
function changeset (line 269) | function changeset(from, to, parentPath = []) {
function changesetConflicts (line 301) | function changesetConflicts(a, b) {
function applyChangeset (line 387) | function applyChangeset(obj, changeset) {
function pickBy (line 408) | function pickBy(obj = {}, predicate = (value, key) => false) {
function dropKeys (line 429) | function dropKeys(obj, keys) {
FILE: pkg/rancher-desktop/utils/osVersion.ts
function fetchMacOsVersion (line 10) | async function fetchMacOsVersion(console?: Log) {
function getMacOsVersion (line 27) | function getMacOsVersion(): semver.SemVer {
FILE: pkg/rancher-desktop/utils/paths.ts
type Paths (line 11) | interface Paths {
class UnixPaths (line 46) | class UnixPaths implements Paths {
method constructor (line 62) | constructor(pathsData: Record<string, unknown>) {
method wslDistro (line 66) | get wslDistro(): string {
method wslDistroData (line 70) | get wslDistroData(): string {
class WindowsPaths (line 75) | class WindowsPaths implements Paths {
method constructor (line 88) | constructor(pathsData: Record<string, unknown>) {
method lima (line 92) | get lima(): string {
method integration (line 96) | get integration(): string {
method deploymentProfileSystem (line 100) | get deploymentProfileSystem(): string {
method altDeploymentProfileSystem (line 104) | get altDeploymentProfileSystem(): string {
method deploymentProfileUser (line 108) | get deploymentProfileUser(): string {
function getRdctlPath (line 114) | function getRdctlPath(): string | null {
function getPaths (line 133) | function getPaths(): Paths {
FILE: pkg/rancher-desktop/utils/platform.js
function isAlternate (line 17) | function isAlternate(event) {
function isMore (line 21) | function isMore(event) {
function isRange (line 25) | function isRange(event) {
function suppressContextMenu (line 29) | function suppressContextMenu(event) {
function version (line 34) | function version() {
constant KEY (line 50) | const KEY = {
FILE: pkg/rancher-desktop/utils/position.js
constant LEFT (line 3) | const LEFT = 'left';
constant RIGHT (line 4) | const RIGHT = 'right';
constant TOP (line 5) | const TOP = 'top';
constant CENTER (line 6) | const CENTER = 'center';
constant MIDDLE (line 7) | const MIDDLE = 'center';
constant BOTTOM (line 8) | const BOTTOM = 'bottom';
constant AUTO (line 9) | const AUTO = 'auto';
function boundingRect (line 11) | function boundingRect(elem) {
function fakeRectFor (line 26) | function fakeRectFor(event) {
function screenRect (line 37) | function screenRect() {
function fitOnScreen (line 53) | function fitOnScreen(contentElem, triggerElemOrEvent, opt, useDefaults) {
FILE: pkg/rancher-desktop/utils/processOutputInterpreters/image-build-output.ts
class ImageBuildOutputCuller (line 3) | class ImageBuildOutputCuller {
method constructor (line 6) | constructor() {
method addData (line 10) | addData(data: string): void {
method getProcessedData (line 17) | getProcessedData(): string {
FILE: pkg/rancher-desktop/utils/processOutputInterpreters/image-non-build-output.ts
class ImageNonBuildOutputCuller (line 8) | class ImageNonBuildOutputCuller {
method constructor (line 14) | constructor() {
method addData (line 21) | addData(data: string) {
method getProcessedData (line 66) | getProcessedData() {
FILE: pkg/rancher-desktop/utils/processOutputInterpreters/trivy-image-output.ts
type finalVulType (line 15) | type finalVulType = Record<string, string>;
class TrivyScanImageOutputCuller (line 17) | class TrivyScanImageOutputCuller {
method constructor (line 22) | constructor() {
method getRating (line 27) | getRating(key: string) {
method fixLines (line 31) | fixLines(lines: string[]) {
method addData (line 36) | addData(data: string): void {
method getProcessedData (line 54) | getProcessedData() {
FILE: pkg/rancher-desktop/utils/protocols.ts
function redirectedUrl (line 20) | function redirectedUrl(relPath: string) {
function setupAppProtocolHandler (line 44) | function setupAppProtocolHandler() {
function setupExtensionProtocolHandler (line 69) | function setupExtensionProtocolHandler(partition?: string): Promise<void> {
function setupProtocolHandlers (line 91) | function setupProtocolHandlers() {
FILE: pkg/rancher-desktop/utils/resources.ts
function platformBinary (line 24) | function platformBinary(name: string): string {
function _executable (line 33) | function _executable(name: keyof typeof executableMap): string {
FILE: pkg/rancher-desktop/utils/safeRename.ts
function safeRename (line 19) | async function safeRename(srcPath: string, destPath: string): Promise<vo...
FILE: pkg/rancher-desktop/utils/select.js
function onClickOption (line 1) | function onClickOption(option, e) {
function calculatePosition (line 29) | function calculatePosition(dropdownList, component, width, placement) {
FILE: pkg/rancher-desktop/utils/shortcuts.ts
type Shortcut (line 24) | interface Shortcut {
type ShortcutExt (line 33) | interface ShortcutExt extends Shortcut {
function matchPlatform (line 37) | function matchPlatform(shortcut: Shortcut): boolean {
class WindowShortcuts (line 50) | class WindowShortcuts {
method constructor (line 54) | constructor(window: BrowserWindow) {
method shortcutsList (line 68) | get shortcutsList() {
method addShortcut (line 72) | addShortcut(shortcut: ShortcutExt) {
method removeShortcut (line 86) | removeShortcut(shortcut: Shortcut) {
method addListener (line 100) | addListener() {
method removeListener (line 104) | removeListener() {
class ShortcutsImpl (line 109) | class ShortcutsImpl {
method register (line 120) | register(window: BrowserWindow, _shortcuts: Shortcut | Shortcut[], cal...
method unregister (line 165) | unregister(window: BrowserWindow, _shortcuts?: Shortcut | Shortcut[], ...
method isRegistered (line 193) | isRegistered(window: BrowserWindow): boolean {
FILE: pkg/rancher-desktop/utils/sort.js
constant TYPE_MAP (line 31) | const TYPE_MAP = {
function typeOf (line 90) | function typeOf(item) {
function spaceship (line 110) | function spaceship(a, b) {
constant TYPE_ORDER (line 116) | const TYPE_ORDER = {
function compare (line 130) | function compare(a, b) {
function parseField (line 172) | function parseField(str) {
function sortBy (line 182) | function sortBy(ary, keys, desc) {
function sortableNumericSuffix (line 215) | function sortableNumericSuffix(str) {
function isNumeric (line 223) | function isNumeric(num) {
FILE: pkg/rancher-desktop/utils/string.js
function camelToTitle (line 1) | function camelToTitle(str) {
function ucFirst (line 7) | function ucFirst(str) {
function lcFirst (line 13) | function lcFirst(str) {
function strPad (line 19) | function strPad(str, toLength, padChars = ' ', right = false) {
function sortableNumericSuffix (line 37) | function sortableNumericSuffix(str) {
function escapeHtml (line 57) | function escapeHtml(html) {
function decodeHtml (line 68) | function decodeHtml(text) {
function escapeRegex (line 76) | function escapeRegex(string) {
function random32 (line 80) | function random32(count) {
constant CHARSET (line 110) | const CHARSET = {
function randomStr (line 122) | function randomStr(length = 16, chars = CHARSET.ALPHA_NUM) {
function formatPercent (line 132) | function formatPercent(value, maxPrecision = 2) {
function pluralize (line 142) | function pluralize(str) {
function resourceNames (line 154) | function resourceNames(names, plusMore, t) {
function indent (line 170) | function indent(lines, count = 2, token = ' ', afterRegex = null) {
function decamelize (line 202) | function decamelize(str) {
function dasherize (line 208) | function dasherize(str) {
function asciiLike (line 212) | function asciiLike(str) {
function coerceStringTypeToScalarType (line 222) | function coerceStringTypeToScalarType(val, type) {
function matchesSomeRegex (line 245) | function matchesSomeRegex(stringRaw, regexes = []) {
function ensureRegex (line 254) | function ensureRegex(strOrRegex, exact = true) {
function nlToBr (line 266) | function nlToBr(value) {
function splitObjectPath (line 272) | function splitObjectPath(path) {
function joinObjectPath (line 282) | function joinObjectPath(ary) {
function shortenedImage (line 300) | function shortenedImage(image) {
function isIpv4 (line 307) | function isIpv4(ip) {
function sanitizeKey (line 313) | function sanitizeKey(k) {
function sanitizeValue (line 317) | function sanitizeValue(v) {
function sanitizeIP (line 321) | function sanitizeIP(v) {
FILE: pkg/rancher-desktop/utils/stringify.ts
function jsonStringifyWithWhiteSpace (line 1) | function jsonStringifyWithWhiteSpace(obj: Record<string, any>): string {
FILE: pkg/rancher-desktop/utils/testUtils/mockModules.ts
class Log (line 7) | class Log {
type defaultOutputType (line 45) | type defaultOutputType = typeof defaultOverrides;
type defaultInputType (line 46) | type defaultInputType = { [key in keyof defaultOutputType]: undefined };
type explicitModuleType (line 47) | type explicitModuleType = Record<string, any>;
type mockModuleParamType (line 48) | type mockModuleParamType = Record<string, explicitModuleType> | Partial<...
type mockModuleReturnType (line 49) | type mockModuleReturnType<T extends mockModuleParamType> = {
function mockModules (line 66) | function mockModules<T extends mockModuleParamType>(modules: T): mockMod...
FILE: pkg/rancher-desktop/utils/testUtils/mockResources.ts
function withResource (line 12) | function withResource<
FILE: pkg/rancher-desktop/utils/testUtils/vue-jest.js
function compileTypeScript (line 34) | function compileTypeScript(source, fileName) {
function processScript (line 46) | function processScript(descriptor, options) {
function processTemplate (line 68) | function processTemplate(descriptor) {
method getCacheKey (line 99) | getCacheKey(sourceText, sourcePath, options) {
method process (line 107) | process(sourceText, filename, options) {
FILE: pkg/rancher-desktop/utils/typeUtils.ts
type RecursivePartial (line 5) | type RecursivePartial<T> = {
type RecursiveReadonly (line 13) | type RecursiveReadonly<T> = {
type ReadWrite (line 21) | type ReadWrite<T> = {
type UpperAlpha (line 26) | type UpperAlpha =
type Alpha (line 31) | type Alpha<T> = T extends UpperAlpha ? T : T extends Lowercase<UpperAlph...
type UpperSnakeCaseInner (line 33) | type UpperSnakeCaseInner<T extends string> =
type UpperSnakeCase (line 47) | type UpperSnakeCase<T extends string | symbol | number > =
type RecursiveKeys (line 59) | type RecursiveKeys<T> =
type RecursiveKeysInner (line 65) | type RecursiveKeysInner<T, K extends string> = K extends keyof T ? `${ K...
type RecursiveTypes (line 71) | type RecursiveTypes<T extends Record<string, any>> =
function defined (line 93) | function defined<T>(input: T | undefined | null): input is T {
type Direction (line 97) | type Direction = 'back' | 'forward';
FILE: pkg/rancher-desktop/utils/units.js
constant UNITS (line 1) | const UNITS = ['', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'];
constant FRACTIONAL (line 2) | const FRACTIONAL = ['', 'm', 'u', 'n', 'p', 'f', 'a', 'z', 'y'];
function formatSi (line 4) | function formatSi(inValue, {
function exponentNeeded (line 50) | function exponentNeeded(val, increment = 1000) {
function parseSi (line 61) | function parseSi(inValue, opt) {
constant MEMORY_PARSE_RULES (line 112) | const MEMORY_PARSE_RULES = {
function createMemoryFormat (line 127) | function createMemoryFormat(n) {
function createMemoryUnits (line 137) | function createMemoryUnits(n) {
function createMemoryValues (line 143) | function createMemoryValues(total, useful) {
FILE: pkg/rancher-desktop/utils/version.ts
function getProductionVersion (line 5) | function getProductionVersion() {
function getDevVersion (line 15) | async function getDevVersion() {
function getVersion (line 27) | async function getVersion() {
function parseDocsVersion (line 39) | function parseDocsVersion(version: string) {
FILE: pkg/rancher-desktop/utils/width.js
function setWidth (line 6) | function setWidth(el, val) {
function getWidth (line 29) | function getWidth(el) {
FILE: pkg/rancher-desktop/utils/wslVersion.ts
type Version (line 10) | interface Version {
type WSLVersionInfo (line 21) | interface WSLVersionInfo {
function makeVersion (line 33) | function makeVersion(major: number, minor = 0, build = 0, revision = 0):...
function versionString (line 37) | function versionString(version: Version): string {
function compareVersion (line 43) | function compareVersion(left: Version, right: Version): -1 | 0 | 1 {
function getWSLVersion (line 55) | async function getWSLVersion(): Promise<WSLVersionInfo> {
FILE: pkg/rancher-desktop/window/dashboard.ts
function openDashboard (line 9) | function openDashboard() {
function closeDashboard (line 32) | function closeDashboard() {
FILE: pkg/rancher-desktop/window/index.ts
function getWindow (line 51) | function getWindow(name: string): Electron.BrowserWindow | null {
function isInternalURL (line 55) | function isInternalURL(url: string) {
function createWindow (line 65) | function createWindow(name: string, url: string, options: Electron.Brows...
function openMain (line 110) | function openMain() {
function updateViewBackground (line 197) | function updateViewBackground() {
function createView (line 206) | function createView() {
function extensionNavigate (line 329) | function extensionNavigate() {
function isZoomKeyCombo (line 355) | function isZoomKeyCombo(input: Electron.Input) {
function extensionGetContentAreaListener (line 407) | function extensionGetContentAreaListener(_event: Electron.IpcMainEvent, ...
function openExtension (line 435) | function openExtension(id: string, relPath: string) {
function closeExtension (line 468) | function closeExtension() {
function resizeWindow (line 492) | function resizeWindow(window: Electron.BrowserWindow, width: number, hei...
function openDialog (line 521) | function openDialog(id: string, opts?: Electron.BrowserWindowConstructor...
function openFirstRunDialog (line 600) | async function openFirstRunDialog() {
function openDenyRootDialog (line 612) | async function openDenyRootDialog() {
type reqMessageId (line 624) | type reqMessageId = 'ok' | 'linux-nested' | 'win32-release' | 'win32-ker...
function openUnmetPrerequisitesDialog (line 630) | async function openUnmetPrerequisitesDialog(reasonId: reqMessageId, ...a...
function openKubernetesErrorMessageWindow (line 646) | async function openKubernetesErrorMessageWindow(titlePart: string, mainM...
function openSudoPrompt (line 673) | async function openSudoPrompt(explanations: Record<string, string[]>): P...
function showMessageBox (line 696) | async function showMessageBox(options: Electron.MessageBoxOptions, could...
function send (line 712) | function send(channel: string, ...args: any[]) {
function centerDialog (line 729) | function centerDialog(window: BrowserWindow, dialog: BrowserWindow, offs...
FILE: pkg/rancher-desktop/window/preferenceConstants.ts
type NavItems (line 3) | interface NavItems {
FILE: pkg/rancher-desktop/window/preferences.ts
function openPreferences (line 18) | function openPreferences() {
function preferencesSetDirtyFlag (line 130) | function preferencesSetDirtyFlag(dirtyFlag: boolean) {
FILE: screenshots/Screenshots.ts
type ScreenshotsOptions (line 16) | interface ScreenshotsOptions {
class Screenshots (line 21) | class Screenshots {
method constructor (line 31) | constructor(page: Page, opt: ScreenshotsOptions) {
method buildPath (line 39) | protected buildPath(title: string): string {
method createScreenshotsDirectory (line 43) | protected async createScreenshotsDirectory() {
method screenshot (line 54) | protected async screenshot(title: string, includeAll = false) {
method screenshotDarwin (line 74) | protected async screenshotDarwin(outPath: string, includeAll: boolean) {
method screenshotWindows (line 85) | protected async screenshotWindows(outPath: string, includeAll: boolean) {
method screenshotLinux (line 95) | protected async screenshotLinux(outPath: string, includeAll: boolean) {
class MainWindowScreenshots (line 126) | class MainWindowScreenshots extends Screenshots {
method constructor (line 127) | constructor(page: Page, opt: ScreenshotsOptions) {
method take (line 134) | async take(name: string, navPageOrIncludeAll?: NavPage | boolean, time...
class PreferencesScreenshots (line 152) | class PreferencesScreenshots extends Screenshots {
method constructor (line 155) | constructor(page: Page, preferencePage: PreferencesPage, opt: Screensh...
method take (line 161) | async take(tabName: string, subTabName?: string) {
FILE: scripts/build.ts
class Builder (line 16) | class Builder {
method cleanup (line 17) | async cleanup() {
method buildRenderer (line 52) | async buildRenderer() {
method build (line 66) | async build() {
method run (line 74) | async run() {
FILE: scripts/check-api-schema.ts
type schemaObject (line 33) | interface schemaObject {
type schemaString (line 38) | interface schemaString {
type schemaInteger (line 41) | interface schemaInteger {
type schemaBoolean (line 44) | interface schemaBoolean {
type schemaArray (line 47) | interface schemaArray {
type schemaMissing (line 51) | interface schemaMissing {
type schemaNode (line 55) | type schemaNode = schemaObject | schemaString | schemaInteger | schemaBo...
function makePath (line 61) | function makePath(pathParts: string[]): string {
function checkObject (line 74) | function checkObject(setting: RecursiveReadonly<any>, schema: schemaNode...
FILE: scripts/dependencies/go-source.ts
type GoDependencyOptions (line 6) | interface GoDependencyOptions {
class GoDependency (line 37) | class GoDependency implemen
Condensed preview — 994 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,320K chars).
[
{
"path": ".editorconfig",
"chars": 380,
"preview": "# EditorConfig helps developers define and maintain consistent\n# coding styles between different editors and IDEs\n# edit"
},
{
"path": ".gitattributes",
"chars": 252,
"preview": "# All Linux scripts should have LF line endings\n# But only text files should be changed (not any binaries / images / etc"
},
{
"path": ".github/.yamlfmt",
"chars": 64,
"preview": "formatter:\n indentless_arrays: true\n retain_line_breaks: true\n"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.yml",
"chars": 2876,
"preview": "name: Bug Report\ndescription: Report Rancher Desktop issue\nlabels: [\"kind/bug\"]\nbody:\n- type: textarea\n attributes:\n "
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 439,
"preview": "blank_issues_enabled: true\ncontact_links:\n- name: Ask a question (GitHub Discussions)\n url: https://github.com/rancher-"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.yml",
"chars": 651,
"preview": "name: Feature Request\ndescription: \"Suggest a feature or idea to Rancher Desktop.\"\nlabels: [\"kind/enhancement\"]\nbody:\n- "
},
{
"path": ".github/actions/get-token/action.yaml",
"chars": 1544,
"preview": "name: Get Token\ndescription: >-\n This action attempts to get a token with the requested permissions; if this is\n not r"
},
{
"path": ".github/actions/setup-environment/action.yaml",
"chars": 5102,
"preview": "name: Setup Environment\ndescription: >-\n This is a composite action that is used to set up the runner for running\n Ran"
},
{
"path": ".github/actions/spelling/README.md",
"chars": 2531,
"preview": "# check-spelling/check-spelling configuration\n\nFile | Purpose | Format | Info\n---- | ------- | ------ | ----\n[dictionary"
},
{
"path": ".github/actions/spelling/advice.md",
"chars": 1417,
"preview": "<!-- See https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-advice --> <!-- markdownlint-di"
},
{
"path": ".github/actions/spelling/allow.txt",
"chars": 55,
"preview": "emoji\ngithub\nhttps\npasswordless\nssh\nubuntu\nworkarounds\n"
},
{
"path": ".github/actions/spelling/candidate.patterns",
"chars": 21713,
"preview": "# Repeated letters\n\\b([A-Za-z])\\g{-1}{2,}\\b\n\n# marker to ignore all code on line\n^.*/\\* #no-spell-check-line \\*/.*$\n# ma"
},
{
"path": ".github/actions/spelling/excludes.txt",
"chars": 2011,
"preview": "# See https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-excludes\n(?:^|/)(?i)COPYRIGHT\n(?:^|/"
},
{
"path": ".github/actions/spelling/expect.txt",
"chars": 6643,
"preview": "abbrv\nactionmenu\nACTIONSTART\nactivedirectory\naddexclusion\naddext\naddgroup\naddlabel\naddrepo\nadfs\nadrg\nairgap\naks\nalertman"
},
{
"path": ".github/actions/spelling/line_forbidden.patterns",
"chars": 35518,
"preview": "# reject `m_data` as VxWorks defined it and that breaks things if it's used elsewhere\n# see [fprime](https://github.com/"
},
{
"path": ".github/actions/spelling/patterns.txt",
"chars": 6733,
"preview": "# See https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-patterns\n\n^(?:Build|)Requires: [-.\\w"
},
{
"path": ".github/actions/spelling/reject.txt",
"chars": 261,
"preview": "attache\naroynt.*\nbellows?\nbenefitting\noccurences?\n.*dnt\ndependan.*\ndevelopement\ndevelopp?e\nDevers?\ndevex.*\ndevide\nDevinn"
},
{
"path": ".github/actions/yarn-install/action.yaml",
"chars": 1523,
"preview": "name: Yarn Install\ndescription: >-\n This is a composite action that does everything needed to do `yarn install`.\n\nruns:"
},
{
"path": ".github/dependabot.yml",
"chars": 1316,
"preview": "version: 2\nupdates:\n\n# Maintain dependencies for GitHub Actions\n- package-ecosystem: \"github-actions\"\n directories:\n -"
},
{
"path": ".github/workflows/bats/get-tests.py",
"chars": 4420,
"preview": "#!/usr/bin/env python3\n\n# This script determines the tests to be run.\n# Inputs (as environment variables, all are space-"
},
{
"path": ".github/workflows/bats/sanitize-artifact-name.sh",
"chars": 1624,
"preview": "#!/bin/bash\nset -o errexit -o nounset -o pipefail\n\n# GitHub restricts artifact filenames:\n\n# Invalid characters include:"
},
{
"path": ".github/workflows/bats/summarize.mjs",
"chars": 10407,
"preview": "// This file creates the summary table at the end of the run.\n//\n// Inputs:\n// */version.txt -- The version of Ranch"
},
{
"path": ".github/workflows/bats.yaml",
"chars": 11986,
"preview": "name: BATS\non:\n workflow_dispatch:\n inputs:\n owner:\n description: Override owner (e.g. rancher-sandbox)\n"
},
{
"path": ".github/workflows/codeql.yaml",
"chars": 4093,
"preview": "name: \"CodeQL Advanced\"\n\non:\n push:\n branches: [\"main\", \"release*\"]\n pull_request:\n branches: [\"main\", \"release*"
},
{
"path": ".github/workflows/docker-cli-monitor.yaml",
"chars": 905,
"preview": "name: Check for new releases of docker/cli\non:\n schedule:\n - cron: '55 8 * * *'\n workflow_dispatch: {}\n\njobs:\n che"
},
{
"path": ".github/workflows/k3s-versions.yaml",
"chars": 1084,
"preview": "name: Update k3s-versions.json\non:\n schedule:\n - cron: '43 8 * * *'\n workflow_dispatch: {}\n\npermissions:\n contents: "
},
{
"path": ".github/workflows/linux-e2e.yaml",
"chars": 1618,
"preview": "name: e2e tests on Linux\n\non:\n workflow_dispatch:\n push:\n branches-ignore:\n - 'dependabot/**'\n pull_request: {}"
},
{
"path": ".github/workflows/linux-release.yaml",
"chars": 2213,
"preview": "name: Upload Linux release\non:\n release:\n types:\n - published\n workflow_dispatch: {}\n\ndefaults:\n run:\n she"
},
{
"path": ".github/workflows/macM1-e2e.yaml",
"chars": 2320,
"preview": "name: e2e tests on Mac M1\n\non:\n workflow_dispatch:\n schedule:\n - cron: '15 8 * * 1-5'\n\njobs:\n\n e2e-tests:\n timeou"
},
{
"path": ".github/workflows/package.yaml",
"chars": 9002,
"preview": "name: Package\n\non:\n pull_request:\n paths-ignore:\n - '.github/actions/spelling/**'\n - 'docs/**'\n - '**.md'\n "
},
{
"path": ".github/workflows/paths-ignore.yaml",
"chars": 2563,
"preview": "# This is a reusable workflow to determine if the current change requires an E2E\n# run. This is required because using "
},
{
"path": ".github/workflows/rddepman.yaml",
"chars": 868,
"preview": "name: Update external dependencies\non:\n schedule:\n - cron: '23 8 * * *'\n workflow_dispatch: {}\n\npermissions:\n cont"
},
{
"path": ".github/workflows/rdx-host-api-tests.yaml",
"chars": 1446,
"preview": "# This workflow builds the Rancher Desktop Extensions Host APIs testing image\n# and publishes it.\n\nname: RDX Host APIs T"
},
{
"path": ".github/workflows/release-merge-to-main.yaml",
"chars": 996,
"preview": "name: \"Release: Merge to main\"\n\non:\n release:\n types:\n - created\n - published\n - released\n\nconcurrency:\n g"
},
{
"path": ".github/workflows/scorecard.yml",
"chars": 2615,
"preview": "name: Scorecard supply-chain security\non:\n # For Branch-Protection check. Only the default branch is supported. See\n #"
},
{
"path": ".github/workflows/screenshot.yaml",
"chars": 5141,
"preview": "name: Screenshots\n\non:\n workflow_dispatch:\n inputs:\n mock_version:\n description: Mock Version\n ty"
},
{
"path": ".github/workflows/smoke-test/install-from-repo.sh",
"chars": 2778,
"preview": "#!/usr/bin/env bash\n\n# This script is expected to run as root and install Rancher Desktop from the\n# repository obs://is"
},
{
"path": ".github/workflows/smoke-test/smoke-test.sh",
"chars": 10042,
"preview": "#!/usr/bin/env bash\n\n# This script is expected to run from CI, and does a final smoke test.\n# There should be an install"
},
{
"path": ".github/workflows/smoke-test.yaml",
"chars": 11608,
"preview": "# This workflow downloads artifacts from a (by default, draft) release and runs\n# a short smoke test where the applicati"
},
{
"path": ".github/workflows/spelling.yml",
"chars": 4425,
"preview": "name: Check Spelling\n\n# Comment management is handled through a secondary job, for details see:\n# https://github.com/che"
},
{
"path": ".github/workflows/test.yaml",
"chars": 1138,
"preview": "name: Test\n\non:\n push: {}\n pull_request: {}\n\npermissions: {}\n\njobs:\n test:\n runs-on: ubuntu-latest\n steps:\n "
},
{
"path": ".github/workflows/ucmonitor.yaml",
"chars": 846,
"preview": "name: Check for unreleased changes\non:\n schedule:\n - cron: '48 8 * * *'\n workflow_dispatch: {}\n\npermissions:\n issu"
},
{
"path": ".github/workflows/upgrade-generate.yaml",
"chars": 3475,
"preview": "name: Generate Upgrade Test Data\non:\n workflow_dispatch: {}\npermissions:\n contents: read\njobs:\n build:\n strategy:\n"
},
{
"path": ".github/workflows/windows-e2e.yaml",
"chars": 939,
"preview": "name: e2e tests on Windows\n\non:\n workflow_dispatch:\n push:\n branches-ignore:\n - 'dependabot/**'\n pull_request: "
},
{
"path": ".github/workflows/yarn-dedupe.yaml",
"chars": 850,
"preview": "name: Deduplicate yarn.lock\n\non:\n schedule:\n - cron: '0 9 1 * *'\n workflow_dispatch: {}\n\npermissions:\n contents: wri"
},
{
"path": ".gitignore",
"chars": 458,
"preview": "*.exe\n/bats/bats.tar.gz\n/bats/bin/\n/bats/logs/\n/coverage/\n/dist/\n/e2e/reports/\n/go.work.sum\n/node_modules/\n/resources/ce"
},
{
"path": ".gitmodules",
"chars": 515,
"preview": "[submodule \"bats/bats-core\"]\n\tpath = bats/bats-core\n\turl = https://github.com/rancher-sandbox/bats-core.git\n\tbranch = ma"
},
{
"path": ".golangci.yaml",
"chars": 5004,
"preview": "version: \"2\"\nlinters:\n enable:\n - bodyclose\n - copyloopvar\n - dogsled\n - dupl\n - errcheck\n - goconst\n"
},
{
"path": ".yarnrc.yml",
"chars": 123,
"preview": "enableScripts: false\nnodeLinker: node-modules\n\nplugins:\n - path: .yarn/plugins/plugin-rancher-desktop-license-checker.c"
},
{
"path": "CONTRIBUTING.md",
"chars": 5838,
"preview": "# Contributing to Rancher Desktop\n\nRancher Desktop accepts contributions via GitHub pull requests.\nThis document outline"
},
{
"path": "LICENSE",
"chars": 11358,
"preview": "\n Apache License\n Version 2.0, January 2004\n "
},
{
"path": "README.md",
"chars": 15645,
"preview": "# Rancher Desktop\n\n[](https://deepwiki.com/rancher-sandbox/rancher-deskto"
},
{
"path": "babel.config.cjs",
"chars": 824,
"preview": "const packageJson = require('./package.json');\n\nconst electronVersion = parseInt(/\\d+/.exec(packageJson.devDependencies."
},
{
"path": "background.ts",
"chars": 55161,
"preview": "import { spawn } from 'child_process';\nimport fs from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport util fr"
},
{
"path": "bats/Makefile",
"chars": 1737,
"preview": ".PHONY: all\nall:\n\t./bats-core/bin/bats --show-output-of-passing-tests ./tests/*/\n\n.PHONY: containers\ncontainers:\n\t./bats"
},
{
"path": "bats/README.md",
"chars": 9373,
"preview": "## Overview\n\nBATS is a testing framework for Bash shell scripts that provides supporting libraries and helpers for custo"
},
{
"path": "bats/scripts/bats-lint.pl",
"chars": 2584,
"preview": "#!/usr/bin/env perl\n\n# This script checks a BATS script to make sure every `run` or `try` call is\n# followed by a call t"
},
{
"path": "bats/scripts/ghcr-mirror.sh",
"chars": 1592,
"preview": "#!/bin/bash\n\n# Mirror Docker Hub images to ghcr.io to avoid pull limits during testing.\n\n# The script uses skopeo instea"
},
{
"path": "bats/tests/compose/compose.bats",
"chars": 1535,
"preview": "# bats file_tags=opensuse\n\nload '../helpers/load'\n\nlocal_setup() {\n TESTDATA_DIR=\"${PATH_BATS_ROOT}/tests/compose/tes"
},
{
"path": "bats/tests/compose/testdata/Dockerfile.nginx",
"chars": 36,
"preview": "ARG IMAGE_NGINX\nFROM ${IMAGE_NGINX}\n"
},
{
"path": "bats/tests/compose/testdata/app/Dockerfile",
"chars": 180,
"preview": "ARG IMAGE_PYTHON=python:3.9-slim\nFROM ${IMAGE_PYTHON}\n\nWORKDIR /app\n\nCOPY requirements.txt .\nRUN pip install --no-cache-"
},
{
"path": "bats/tests/compose/testdata/app/app.py",
"chars": 163,
"preview": "from flask import Flask\napp = Flask(__name__)\n\n@app.route('/')\ndef hello():\n\treturn \"Hello World!\"\n\nif __name__ == '__ma"
},
{
"path": "bats/tests/compose/testdata/app/requirements.txt",
"chars": 6,
"preview": "flask\n"
},
{
"path": "bats/tests/compose/testdata/compose.yaml",
"chars": 436,
"preview": "services:\n nginx:\n container_name: nginx\n build:\n args:\n - IMAGE_NGINX\n dockerfile: Dockerfile.ngi"
},
{
"path": "bats/tests/compose/testdata/nginx.conf",
"chars": 552,
"preview": "worker_processes 1;\n\nerror_log stderr info;\n\nevents {\n worker_connections 1024;\n}\n\nhttp {\n include mime.t"
},
{
"path": "bats/tests/containers/allowed-images.bats",
"chars": 2110,
"preview": "load '../helpers/load'\nRD_USE_IMAGE_ALLOW_LIST=true\n\n@test 'start' {\n factory_reset\n start_kubernetes\n wait_for"
},
{
"path": "bats/tests/containers/auto-start.bats",
"chars": 3320,
"preview": "load '../helpers/load'\n\n@test 'factory reset' {\n factory_reset\n}\n\n@test 'Start up Rancher Desktop' {\n start_applic"
},
{
"path": "bats/tests/containers/catch-duplicate-api-patterns.bats",
"chars": 791,
"preview": "load '../helpers/load'\nRD_USE_IMAGE_ALLOW_LIST=true\n\n@test 'catch attempts to add duplicate patterns via the API with en"
},
{
"path": "bats/tests/containers/docker-buildx-python3-uname.bats",
"chars": 1402,
"preview": "load '../helpers/load'\n\nlocal_setup() {\n if ! using_docker; then\n skip \"This test only applied to the moby con"
},
{
"path": "bats/tests/containers/factory-reset-containerd-shims.bats",
"chars": 862,
"preview": "load '../helpers/load'\n\nBOGUS_SHIM=\"${PATH_CONTAINERD_SHIMS}/containerd-shim-bogus-v1\"\n\nlocal_setup_file() {\n RD_USE_"
},
{
"path": "bats/tests/containers/factory-reset-snapshots.bats",
"chars": 916,
"preview": "load '../helpers/load'\n\nlocal_setup_file() {\n RD_USE_RAMDISK=false # interferes with deleting $PATH_APP_HOME\n}\n\n@test"
},
{
"path": "bats/tests/containers/factory-reset.bats",
"chars": 6390,
"preview": "load '../helpers/load'\n\nlocal_setup_file() {\n RD_USE_RAMDISK=false # interferes with deleting $PATH_APP_HOME\n}\n\n@test"
},
{
"path": "bats/tests/containers/host-connectivity.bats",
"chars": 635,
"preview": "# bats file_tags=opensuse\n\nload '../helpers/load'\n\n@test 'factory reset' {\n factory_reset\n}\n\n@test 'start container e"
},
{
"path": "bats/tests/containers/host-network-ports.bats",
"chars": 1411,
"preview": "# bats file_tags=opensuse\n\nload '../helpers/load'\n\nLOCALHOST=\"127.0.0.1\"\n\nlocal_setup() {\n if ! is_windows; then\n "
},
{
"path": "bats/tests/containers/init.bats",
"chars": 866,
"preview": "# verify that running a container with --init is working\n# bats file_tags=opensuse\n\nload '../helpers/load'\n\n@test 'facto"
},
{
"path": "bats/tests/containers/platform.bats",
"chars": 1647,
"preview": "load '../helpers/load'\n\n@test 'factory reset' {\n factory_reset\n}\n\n@test 'start container engine' {\n start_containe"
},
{
"path": "bats/tests/containers/published-ports.bats",
"chars": 1103,
"preview": "# bats file_tags=opensuse\n\nload '../helpers/load'\n\n@test 'factory reset' {\n factory_reset\n}\n\n@test 'start container e"
},
{
"path": "bats/tests/containers/published-udp-ports.bats",
"chars": 1665,
"preview": "load '../helpers/load'\n\nlocal_setup() {\n skip_on_unix\n}\n\n@test 'factory reset' {\n factory_reset\n}\n\nbuild_alpine_so"
},
{
"path": "bats/tests/containers/reset.bats",
"chars": 7920,
"preview": "load '../helpers/load'\n\nlocal_setup_file() {\n RD_USE_RAMDISK=false # interferes with deleting $PATH_APP_HOME\n}\n\n@test"
},
{
"path": "bats/tests/containers/run-rancher.bats",
"chars": 901,
"preview": "# bats file_tags=opensuse\n\nload '../helpers/load'\nRD_FILE_RAMDISK_SIZE=12 # We need more disk to run the Rancher image.\n"
},
{
"path": "bats/tests/containers/split-dns-vpn.bats",
"chars": 1323,
"preview": "# bats file_tags=opensuse\n\nload '../helpers/load'\n\nREGISTRY_URL=$(echo \"$RD_VPN_TEST_IMAGE\" | cut -d'/' -f1)\n\nlocal_setu"
},
{
"path": "bats/tests/containers/switch-engines.bats",
"chars": 1550,
"preview": "# Test case 20\n\nload '../helpers/load'\nRD_CONTAINER_ENGINE=moby\n\nswitch_container_engine() {\n local name=$1\n RD_CO"
},
{
"path": "bats/tests/containers/volumes.bats",
"chars": 10450,
"preview": "load '../helpers/load'\n\nget_tempdir() {\n if ! is_windows || ! using_windows_exe; then\n echo \"$BATS_TEST_TMPDIR"
},
{
"path": "bats/tests/containers/wasm.bats",
"chars": 4711,
"preview": "# shellcheck disable=SC2030,SC2031\n# See https://github.com/koalaman/shellcheck/issues/2431\n# https://www.shellcheck.net"
},
{
"path": "bats/tests/extensions/allow-list.bats",
"chars": 3582,
"preview": "load '../helpers/load'\n\nlocal_setup() {\n CONTAINERD_NAMESPACE=rancher-desktop-extensions\n TESTDATA_DIR_HOST=$(host"
},
{
"path": "bats/tests/extensions/containers.bats",
"chars": 3322,
"preview": "load '../helpers/load'\n\nlocal_setup() {\n CONTAINERD_NAMESPACE=rancher-desktop-extensions\n TESTDATA_DIR_HOST=$(host"
},
{
"path": "bats/tests/extensions/install.bats",
"chars": 7169,
"preview": "load '../helpers/load'\n\nlocal_setup() {\n CONTAINERD_NAMESPACE=rancher-desktop-extensions\n TESTDATA_DIR=\"${PATH_BAT"
},
{
"path": "bats/tests/extensions/testdata/Dockerfile",
"chars": 717,
"preview": "FROM registry.suse.com/bci/golang:latest AS builder\nWORKDIR /usr/src/app\nCOPY bin/dummy.go .\nENV GOOS=windows\nRUN go bui"
},
{
"path": "bats/tests/extensions/testdata/Makefile",
"chars": 413,
"preview": "all: \\\n image-basic image-missing-icon image-ui \\\n image-vm-image image-vm-compose image-host-binaries image-host-apis"
},
{
"path": "bats/tests/extensions/testdata/README.md",
"chars": 524,
"preview": "This directory contains sample docker extensions.\n\n### basic\nA basic extension, containing the bare minimum (just an ico"
},
{
"path": "bats/tests/extensions/testdata/basic.json",
"chars": 35,
"preview": "{\n \"icon\": \"extension-icon.svg\"\n}\n"
},
{
"path": "bats/tests/extensions/testdata/bin/dummy.go",
"chars": 414,
"preview": "package main\n\nimport (\n\t\"context\"\n\t\"log\"\n\t\"os\"\n\t\"os/exec\"\n)\n\nfunc main() {\n\tctx := context.Background()\n\tcmd := exec.Com"
},
{
"path": "bats/tests/extensions/testdata/bin/dummy.sh",
"chars": 21,
"preview": "#!/bin/sh\n\nexec \"$@\"\n"
},
{
"path": "bats/tests/extensions/testdata/bin/server.go",
"chars": 2797,
"preview": "// command server listens on the Unix socket `/run/guest-services/hello.sock`\n// (see `everything.json`) to exercise the"
},
{
"path": "bats/tests/extensions/testdata/compose.yaml",
"chars": 87,
"preview": "name: sample-compose\nservices:\n backend-service:\n image: \"${DESKTOP_PLUGIN_IMAGE}\"\n"
},
{
"path": "bats/tests/extensions/testdata/everything.json",
"chars": 677,
"preview": "{\n \"icon\": \"extension-icon.svg\",\n \"host\": {\n \"binaries\": [\n {\n \"darwin\": [\n {\n \"pat"
},
{
"path": "bats/tests/extensions/testdata/host-apis.json",
"chars": 235,
"preview": "{\n \"info\": \"This is used to do manual testing of various host APIs\",\n \"icon\": \"extension-icon.svg\",\n \"ui\": {\n \"das"
},
{
"path": "bats/tests/extensions/testdata/host-binaries.json",
"chars": 365,
"preview": "{\n \"icon\": \"extension-icon.svg\",\n \"host\": {\n \"binaries\": [\n {\n \"darwin\": [\n {\n \"pat"
},
{
"path": "bats/tests/extensions/testdata/missing-icon-file.json",
"chars": 97,
"preview": "{\n \"icon\": \"does-not-exist.svg\",\n \"info\": \"This extension uses an icon that does not exist.\"\n}\n"
},
{
"path": "bats/tests/extensions/testdata/missing-icon.json",
"chars": 62,
"preview": "{\n \"info\": \"This extension definition is missing an icon.\"\n}\n"
},
{
"path": "bats/tests/extensions/testdata/ui/host-apis.html",
"chars": 3736,
"preview": "<!DOCTYPE html>\n<html>\n\n<head>\n <script type=\"application/javascript\">\n\n function openExternal() {\n ddClient.ho"
},
{
"path": "bats/tests/extensions/testdata/ui/index.html",
"chars": 224,
"preview": "<!DOCTYPE html>\n<html>\n <head>\n <title>Test Extension</title>\n </head>\n <body>\n <h1>Test Extension</h1>\n <p>"
},
{
"path": "bats/tests/extensions/testdata/ui.json",
"chars": 161,
"preview": "{\n \"icon\": \"extension-icon.svg\",\n \"ui\": {\n \"dashboard-tab\": {\n \"title\": \"Sample Extension\",\n \"root\": \"/ui"
},
{
"path": "bats/tests/extensions/testdata/vm-compose.json",
"chars": 137,
"preview": "{\n \"icon\": \"extension-icon.svg\",\n \"info\": \"This image uses vm.composefile\",\n \"vm\": {\n \"composefile\": \"/compose/com"
},
{
"path": "bats/tests/extensions/testdata/vm-image.json",
"chars": 149,
"preview": "{\n \"icon\": \"extension-icon.svg\",\n \"info\": \"This extension contains a reference to an image.\",\n \"vm\": {\n \"image\": \""
},
{
"path": "bats/tests/helpers/commands.bash",
"chars": 2936,
"preview": "EXE=\"\"\nPLATFORM=$OS\nif is_windows; then\n PLATFORM=linux\n if using_windows_exe; then\n EXE=\".exe\"\n PLA"
},
{
"path": "bats/tests/helpers/defaults.bash",
"chars": 7352,
"preview": "########################################################################\n: \"${RD_CONTAINER_ENGINE:=containerd}\"\n\nvalidat"
},
{
"path": "bats/tests/helpers/images.bash",
"chars": 1109,
"preview": "# These images have been mirrored to ghcr.io (using bats/scripts/ghcr-mirror.sh)\n# to avoid hitting Docker Hub pull limi"
},
{
"path": "bats/tests/helpers/info.bash",
"chars": 2011,
"preview": "# shellcheck disable=SC2059\n# https://www.shellcheck.net/wiki/SC2059 -- Don't use variables in the printf format string."
},
{
"path": "bats/tests/helpers/kubernetes.bash",
"chars": 3971,
"preview": "wait_for_kubelet() {\n local desired_version=${1:-$RD_KUBERNETES_VERSION}\n local timeout=$(($(date +%s) + RD_KUBELE"
},
{
"path": "bats/tests/helpers/kubernetes.bats",
"chars": 938,
"preview": "load '../helpers/load'\n\n: \"${RD_INFO:=false}\"\n\n@test 'unwrap_kube_list: no list' {\n run echo '{\"kind\": \"Pod\"}'\n as"
},
{
"path": "bats/tests/helpers/load.bash",
"chars": 4345,
"preview": "set -o errexit -o nounset -o pipefail\n\n# Make sure run() will execute all functions with errexit enabled\nexport BATS_RUN"
},
{
"path": "bats/tests/helpers/os.bash",
"chars": 2668,
"preview": "# https://www.shellcheck.net/wiki/SC2120 -- disabled due to complaining about not referencing arguments that are optiona"
},
{
"path": "bats/tests/helpers/paths.bash",
"chars": 4125,
"preview": "# PATH_BATS_ROOT, PATH_BATS_LOGS, and PATH_BATS_HELPERS are already set by load.bash\n\nPATH_REPO_ROOT=$(absolute_path \"$P"
},
{
"path": "bats/tests/helpers/profile.bash",
"chars": 10908,
"preview": "case $OS in\ndarwin)\n PROFILE_SYSTEM_DEFAULTS=/Library/Preferences/io.rancherdesktop.profile.defaults.plist\n PROFIL"
},
{
"path": "bats/tests/helpers/snapshots.bash",
"chars": 573,
"preview": "delete_all_snapshots() {\n run rdctl snapshot list --json\n assert_success\n # On Windows, executing native Window"
},
{
"path": "bats/tests/helpers/utils.bash",
"chars": 15516,
"preview": "to_lower() {\n echo \"$@\" | tr '[:upper:]' '[:lower:]'\n}\n\nto_upper() {\n echo \"$@\" | tr '[:lower:]' '[:upper:]'\n}\n\nis"
},
{
"path": "bats/tests/helpers/utils.bats",
"chars": 14138,
"preview": "# bats file_tags=opensuse\n\nload '../helpers/load'\n\n: \"${RD_INFO:=false}\"\n\n##############################################"
},
{
"path": "bats/tests/helpers/vm.bash",
"chars": 15333,
"preview": "wait_for_shell() {\n if is_windows; then\n try --max 48 --delay 5 rdctl shell grep ID= /etc/os-release\n i"
},
{
"path": "bats/tests/k8s/enable-disable-k8s.bats",
"chars": 581,
"preview": "# Test case 8, 13, 22\n\nload '../helpers/load'\n\n@test 'factory reset' {\n factory_reset\n}\n\nverify_k8s_is_running() {\n "
},
{
"path": "bats/tests/k8s/foreach-k3s-version.bats",
"chars": 263,
"preview": "load '../helpers/load'\n\nwait_for_dns() {\n try assert_pod_containers_are_running \\\n --namespace kube-system \\\n "
},
{
"path": "bats/tests/k8s/helm-install-rancher.bats",
"chars": 5047,
"preview": "# Test case 11 & 12\n# bats file_tags=opensuse\n\nload '../helpers/load'\nRD_FILE_RAMDISK_SIZE=12 # We need more disk to run"
},
{
"path": "bats/tests/k8s/port-forwarding.bats",
"chars": 2106,
"preview": "load '../helpers/load'\n\n@test 'start k8s' {\n factory_reset\n start_kubernetes\n wait_for_kubelet\n}\n\n@test 'deploy"
},
{
"path": "bats/tests/k8s/specify-invalid-k8s-version.bats",
"chars": 972,
"preview": "load '../helpers/load'\n\n@test 'factory reset' {\n factory_reset\n}\n\n@test 'invalid k8s version' {\n start_kubernetes "
},
{
"path": "bats/tests/k8s/spinkube-npm.bats",
"chars": 2241,
"preview": "load '../helpers/load'\n\nlocal_setup_file() {\n echo \"$RANDOM\" >\"${BATS_FILE_TMPDIR}/random\"\n}\n\nlocal_setup() {\n if "
},
{
"path": "bats/tests/k8s/spinkube.bats",
"chars": 2730,
"preview": "load '../helpers/load'\n\nlocal_setup() {\n if using_docker; then\n skip \"this test only works on containerd right"
},
{
"path": "bats/tests/k8s/traefik.bats",
"chars": 4360,
"preview": "load '../helpers/load'\n\nlocal_setup() {\n if is_windows && ! using_windows_exe; then\n # BUG BUG BUG not yet imp"
},
{
"path": "bats/tests/k8s/up-downgrade-k8s.bats",
"chars": 5460,
"preview": "# Test cases 8, 13, 19\n\nload '../helpers/load'\n\nlocal_setup_file() {\n if semver_eq \"$RD_KUBERNETES_VERSION\" \"$RD_KUBE"
},
{
"path": "bats/tests/k8s/wasm.bats",
"chars": 3871,
"preview": "load '../helpers/load'\n\nlocal_setup() {\n if using_docker; then\n skip \"this test only works on containerd right"
},
{
"path": "bats/tests/preferences/move-from-roaming-to-local.bats",
"chars": 1340,
"preview": "load '../helpers/load'\n\nlocal_setup() {\n skip_on_unix 'roaming appdata => local appdata migration is windows-only'\n "
},
{
"path": "bats/tests/preferences/surface-invalid-args.bats",
"chars": 1065,
"preview": "load '../helpers/load'\n\nlocal_setup() {\n skip_on_windows\n}\n\n@test 'initial factory reset' {\n factory_reset\n}\n\n@tes"
},
{
"path": "bats/tests/preferences/verify-paths.bats",
"chars": 2283,
"preview": "# Test case 30\n\nload '../helpers/load'\n# Ensure subshells don't inherit a path that includes ~/.rd/bin\nexport PATH\nPATH="
},
{
"path": "bats/tests/preferences/verify-settings.bats",
"chars": 1420,
"preview": "load '../helpers/load'\n\nlocal_setup() {\n if is_windows; then\n skip \"test not applicable on Windows\"\n fi\n}\n\n"
},
{
"path": "bats/tests/profile/create-profile-output.bats",
"chars": 16415,
"preview": "load '../helpers/load'\n\n@test 'factory reset' {\n factory_reset\n}\n\nBOGUS_CONTAINERD_NAMESPACE=change-to-k8s.io\n\n@test "
},
{
"path": "bats/tests/profile/deployment.bats",
"chars": 8487,
"preview": "load '../helpers/load'\n\nlocal_setup() {\n # Tell start_container_engine to store additional settings in the current\n "
},
{
"path": "bats/tests/profile/invalid-locked-k8s-version.bats",
"chars": 1772,
"preview": "load '../helpers/load'\n\nlocal_setup() {\n RD_USE_PROFILE=true\n PROFILE_TYPE=$PROFILE_LOCKED\n}\n\nlocal_teardown_file("
},
{
"path": "bats/tests/profile/wasm.bats",
"chars": 1001,
"preview": "load '../helpers/load'\n\nlocal_teardown_file() {\n foreach_profile delete_profile\n}\n\n@test 'create version 10 locked pr"
},
{
"path": "bats/tests/registry/creds.bats",
"chars": 8132,
"preview": "load '../helpers/load'\n\nlocal_setup() {\n REGISTRY_PORT=\"5050\"\n if is_windows && ! using_windows_exe; then\n "
},
{
"path": "bats/tests/snapshots/create-use-snapshot.bats",
"chars": 5871,
"preview": "load '../helpers/load'\n\nlocal_setup() {\n SNAPSHOT=the-ubiquitous-flounder\n}\n\n@test 'factory reset and delete all the "
},
{
"path": "bats/tests/snapshots/restore-snapshot-after-factory-reset.bats",
"chars": 1830,
"preview": "load '../helpers/load'\n\nlocal_setup() {\n SNAPSHOT=some-test-snapshot-name\n}\n\n@test 'factory reset and delete all the "
},
{
"path": "bats/tests/snapshots/test-snapshot-list.bats",
"chars": 3790,
"preview": "load '../helpers/load'\n\nlocal_setup() {\n skip_on_windows \"snapshots test not applicable on Windows\"\n NON_ALNUM_SNA"
},
{
"path": "bats/tests/snapshots/test_rdctl_snapshot.bats",
"chars": 425,
"preview": "load '../helpers/load'\n\n# TODO: Uncomment this test when snapshots go unhidden.\n#@test 'snapshot shows up in general hel"
},
{
"path": "bats/tests/utils/rdctl.bats",
"chars": 1820,
"preview": "load '../helpers/load'\n\n# Verify various operations of `rdctl`\n\n@test 'factory reset' {\n factory_reset\n}\n\n@test 'star"
},
{
"path": "bats/tests/utils/spin.bats",
"chars": 1502,
"preview": "load '../helpers/load'\n\n# Verify that enabling Wasm support will install spin plugins and templates\n\nlocal_setup() {\n "
},
{
"path": "build/electron-publisher-custom.js",
"chars": 1694,
"preview": "const childProcess = require('child_process');\nconst fs = require('fs');\nconst path = require('path');\nconst url = requi"
},
{
"path": "build/license.rtf",
"chars": 10937,
"preview": "{\\rtf1\n{\\fonttbl{\\f0\\fmodern\\fcharset0}}\n\\f0\\fs18\n{\\qc\nApache License\\line\nVersion 2.0, January 2004\\line\nhttp://www.apa"
},
{
"path": "build/signing-config-mac.yaml",
"chars": 1856,
"preview": "# This file describes the code signing configuration for macOS.\n\n# List of entitlements.\nentitlements:\n # This contains"
},
{
"path": "build/signing-config-win.yaml",
"chars": 1005,
"preview": "# This file describes the code signing configuration for Windows.\n\n# The key is a directory name, relative to the unpack"
},
{
"path": "build/wix/dialogs.wxs",
"chars": 2788,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Wix xmlns=\"http://schemas.microsoft.com/wix/2006/wi\">\n <Fragment>\n <!-- Let "
},
{
"path": "build/wix/main.wxs",
"chars": 9126,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n - Main WiX source for the Rancher Desktop Installer\n -\n - This file is a"
},
{
"path": "build/wix/scope.wxs",
"chars": 2882,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n - This describes the install scope dialog; we are customizing this one to\n"
},
{
"path": "build/wix/string-overrides.wxl",
"chars": 1318,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<WixLocalization Culture=\"en-US\" Codepage=\"1252\" xmlns=\"http://schemas.microsoft."
},
{
"path": "build/wix/verify.wxs",
"chars": 4387,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<Wix xmlns=\"http://schemas.microsoft.com/wix/2006/wi\">\n <Fragment>\n <UI>\n "
},
{
"path": "build/wix/welcome.wxs",
"chars": 2458,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- This describes the welcome dialog -->\n<Wix xmlns=\"http://schemas.microsoft.c"
},
{
"path": "dev-app-update.yml",
"chars": 188,
"preview": "owner: rancher-sandbox\nrepo: rancher-desktop\nupdaterCacheDirName: rancher-desktop\nprovider: custom\nupgradeServer: https:"
},
{
"path": "docs/development/README.md",
"chars": 582,
"preview": "# Developer Documentation\n\nNote that the below table of contents may be out of date\n(we may forget to update it). If you"
},
{
"path": "docs/development/env.md",
"chars": 922,
"preview": "# Internal Rancher Desktop environment variables\n\nThese variables are used for build and development purposes; they are "
},
{
"path": "docs/development/factory-reset.md",
"chars": 472,
"preview": "When `rdctl reset --factory` is launched from the UI, it writes its stdout into\n`TMP/rdctl-stdout.txt`\n\nwhere on linux `"
},
{
"path": "docs/development/features.md",
"chars": 3362,
"preview": "# Rancher Desktop Features\n\nThis document lists the high-level Rancher Desktop features and their current status.\n\n| Sym"
},
{
"path": "docs/development/linux-release-process.md",
"chars": 5128,
"preview": "# Linux Release Process\n\n**Note**: please read the [OBS Tips Documentation](obs.md)\nbefore this document. It includes in"
},
{
"path": "docs/development/obs.md",
"chars": 6141,
"preview": "# Tips for Working with OBS\n\nThis document contains information on how to use OBS effectively.\nIf you have not used OBS "
},
{
"path": "docs/development/release-checklist.md",
"chars": 1106,
"preview": "## Release Checklist\n\n- [ ] Update version number in package.json if not done after last release.\n- [ ] Tag release bran"
},
{
"path": "docs/development/signing.md",
"chars": 5585,
"preview": "# Signing Releases\n\nNormally, we build artifacts via GitHub Actions as zip files, which can then be\nsigned offline. Thi"
},
{
"path": "docs/networking/windows/README.md",
"chars": 1600,
"preview": "\n# Rancher Desktop Network Documentation\n\nThe table of contents below provides references to all the projects that compr"
},
{
"path": "docs/networking/windows/rancher-desktop-guest-agent.md",
"chars": 13804,
"preview": "# **[Rancher Desktop Guest Agent](../../../src/go/guestagent)**\n\nThe Rancher Desktop Guest Agent operates within the Ran"
},
{
"path": "docs/networking/windows/rancher-desktop-networking.md",
"chars": 10378,
"preview": "\n# [Rancher Desktop Networking](../../../src/go/networking/)\n\nRancher Desktop Networking primarily acts as a layer 2 swi"
},
{
"path": "e2e/assets/k8s-deploy-sample/nginx-sample-app.yaml",
"chars": 520,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: nginx-app\nspec:\n selector:\n matchLabels:\n app: nginx\n "
},
{
"path": "e2e/backend.e2e.spec.ts",
"chars": 8164,
"preview": "import fs from 'fs';\nimport os from 'os';\nimport path from 'path';\n\nimport { test, expect } from '@playwright/test';\nimp"
},
{
"path": "e2e/config/playwright-config.ts",
"chars": 748,
"preview": "import * as path from 'path';\n\nimport { defineConfig } from '@playwright/test';\n\nconst ci = !!process.env.CI;\nconst outp"
},
{
"path": "e2e/containers.e2e.spec.ts",
"chars": 13842,
"preview": "import { expect, test, ElectronApplication, Page } from '@playwright/test';\n\nimport { ContainerLogsPage } from './pages/"
},
{
"path": "e2e/credentials-server.e2e.spec.ts",
"chars": 25008,
"preview": "/*\nCopyright © 2022 SUSE LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file "
},
{
"path": "e2e/extensions.e2e.spec.ts",
"chars": 18235,
"preview": "/*\n * This tests interactions with the extension front end.\n * An E2E test is required to have access to the web page co"
},
{
"path": "e2e/lockedFields.e2e.spec.ts",
"chars": 5046,
"preview": "/*\nCopyright © 2023 SUSE LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file "
},
{
"path": "e2e/main.e2e.spec.ts",
"chars": 2457,
"preview": "import { test, expect, _electron } from '@playwright/test';\n\nimport { NavPage } from './pages/nav-page';\nimport { create"
},
{
"path": "e2e/pages/container-logs-page.ts",
"chars": 2285,
"preview": "import { expect } from '@playwright/test';\n\nimport type { Locator, Page } from '@playwright/test';\n\nexport class Contain"
},
{
"path": "e2e/pages/container-shell-page.ts",
"chars": 3678,
"preview": "import { expect } from '@playwright/test';\n\nimport type { Locator, Page } from '@playwright/test';\n\nexport class Contain"
},
{
"path": "e2e/pages/containers-page.ts",
"chars": 2225,
"preview": "import { Locator, Page, expect } from '@playwright/test';\n\ntype ActionString = 'info' | 'stop' | 'start' | 'delete';\n\nex"
},
{
"path": "e2e/pages/diagnostics-page.ts",
"chars": 461,
"preview": "import type { Page, Locator } from '@playwright/test';\n\ninterface CheckerRows {\n muteButton: Locator;\n}\n\nexport class D"
},
{
"path": "e2e/pages/extensions-page.ts",
"chars": 693,
"preview": "import type { Page, Locator } from '@playwright/test';\n\nexport class ExtensionsPage {\n readonly page: Page;\n "
},
{
"path": "e2e/pages/images-page.ts",
"chars": 453,
"preview": "import type { Page, Locator } from '@playwright/test';\n\nexport class ImagesPage {\n readonly page: Page;\n readon"
},
{
"path": "e2e/pages/k8s-page.ts",
"chars": 782,
"preview": "import type { Page, Locator } from '@playwright/test';\nexport class K8sPage {\n readonly page: Page;\n reado"
},
{
"path": "e2e/pages/nav-page.ts",
"chars": 5492,
"preview": "import util from 'util';\n\nimport { ContainersPage } from './containers-page';\nimport { DiagnosticsPage } from './diagnos"
},
{
"path": "e2e/pages/portforward-page.ts",
"chars": 469,
"preview": "import type { Page, Locator } from '@playwright/test';\nexport class PortForwardPage {\n readonly page: Page;\n re"
},
{
"path": "e2e/pages/preferences/application.ts",
"chars": 1579,
"preview": "import type { Page, Locator } from '@playwright/test';\nexport class ApplicationNav {\n readonly page: "
},
{
"path": "e2e/pages/preferences/containerEngine.ts",
"chars": 988,
"preview": "import type { Page, Locator } from '@playwright/test';\n\nexport class ContainerEngineNav {\n readonly page: "
},
{
"path": "e2e/pages/preferences/index.ts",
"chars": 865,
"preview": "import { ApplicationNav } from './application';\nimport { ContainerEngineNav } from './containerEngine';\nimport { Kuberne"
},
{
"path": "e2e/pages/preferences/kubernetes.ts",
"chars": 986,
"preview": "import type { Page, Locator } from '@playwright/test';\n\nexport class KubernetesNav {\n readonly page: "
},
{
"path": "e2e/pages/preferences/virtualMachine.ts",
"chars": 1905,
"preview": "import type { Page, Locator } from '@playwright/test';\n\nexport class VirtualMachineNav {\n readonly page: Pag"
},
{
"path": "e2e/pages/preferences/wsl.ts",
"chars": 676,
"preview": "import type { Page, Locator } from '@playwright/test';\n\nexport class WslNav {\n readonly page: Page;\n readon"
},
{
"path": "e2e/pages/snapshots-page.ts",
"chars": 693,
"preview": "import { Locator, Page } from '@playwright/test';\n\nexport class SnapshotsPage {\n readonly page: Page"
},
{
"path": "e2e/pages/troubleshooting-page.ts",
"chars": 510,
"preview": "import type { Page, Locator } from '@playwright/test';\n\nexport class TroubleshootingPage {\n readonly page: "
},
{
"path": "e2e/pages/volumes-page.ts",
"chars": 3630,
"preview": "import { expect } from '@playwright/test';\n\nimport type { Locator, Page } from '@playwright/test';\n\ntype ActionString = "
},
{
"path": "e2e/pages/wsl-integrations-page.ts",
"chars": 1956,
"preview": "import { expect } from '@playwright/test';\n\nimport type { Page, Locator } from '@playwright/test';\n\n/**\n * CheckboxLocat"
},
{
"path": "e2e/preferences.e2e.spec.ts",
"chars": 12419,
"preview": "import os from 'os';\n\nimport { test, expect, _electron } from '@playwright/test';\n\nimport { NavPage } from './pages/nav-"
},
{
"path": "e2e/quit-on-close.e2e.spec.ts",
"chars": 2383,
"preview": "import { test, expect, ElectronApplication } from '@playwright/test';\n\nimport { createDefaultSettings, reportAsset, star"
},
{
"path": "e2e/rdctl.e2e.spec.ts",
"chars": 56003,
"preview": "/*\nCopyright © 2022 SUSE LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file "
},
{
"path": "e2e/start-in-background.e2e.spec.ts",
"chars": 1881,
"preview": "import { test, expect, ElectronApplication } from '@playwright/test';\n\nimport { createDefaultSettings, startRancherDeskt"
},
{
"path": "e2e/startup-profiles.e2e.spec.ts",
"chars": 12944,
"preview": "/*\nCopyright © 2023 SUSE LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file "
},
{
"path": "e2e/utils/ProfileUtils.ts",
"chars": 10193,
"preview": "// Deployment-profile-related utilities\n\nimport fs from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport util "
},
{
"path": "e2e/utils/TestUtils.ts",
"chars": 15097,
"preview": "/**\n * TestUtils exports functions required for the E2E test specs.\n */\nimport fs from 'fs';\nimport os from 'os';\nimport"
}
]
// ... and 794 more files (download for full content)
About this extraction
This page contains the full source code of the rancher-sandbox/rancher-desktop GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 994 files (4.8 MB), approximately 1.3M tokens, and a symbol index with 3588 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.