From a2ae63f332a0d822bd0aaf762f2797de80955ac9 Mon Sep 17 00:00:00 2001 From: wehub-resource-sync Date: Mon, 13 Jul 2026 12:11:06 +0800 Subject: [PATCH] chore: import upstream snapshot with attribution --- .dockerignore | 2 + .editorconfig | 21 + .eslintrc.js | 10 + .gitattributes | 64 + .github/ISSUE_TEMPLATE.md | 11 + .github/actions/publish/action.yml | 205 + .github/actions/test/action.yml | 98 + .github/workflows/flowzone.yml | 41 + .github/workflows/winget.yml | 14 + .gitignore | 123 + .nvmrc | 1 + .prettierrc.js | 6 + .versionbot/CHANGELOG.yml | 13983 ++++++++ CHANGELOG.md | 3099 ++ LICENSE | 177 + README.md | 120 + README.wehub.md | 7 + after-install.tpl | 11 + assets/dmg/background.png | Bin 0 -> 39025 bytes assets/dmg/background.tiff | Bin 0 -> 115576 bytes assets/dmg/background@2x.png | Bin 0 -> 50386 bytes assets/icon.icns | Bin 0 -> 272793 bytes assets/icon.ico | Bin 0 -> 370070 bytes assets/icon.png | Bin 0 -> 5532 bytes assets/iconset/128x128.png | Bin 0 -> 3022 bytes assets/iconset/16x16.png | Bin 0 -> 479 bytes assets/iconset/256x256.png | Bin 0 -> 5532 bytes assets/iconset/32x32.png | Bin 0 -> 802 bytes assets/iconset/48x48.png | Bin 0 -> 1217 bytes assets/iconset/512x512.png | Bin 0 -> 11713 bytes docs/ARCHITECTURE.md | 70 + docs/COMMIT-GUIDELINES.md | 86 + docs/CONTRIBUTING.md | 184 + docs/FAQ.md | 52 + docs/MAINTAINERS.md | 106 + docs/MANUAL-TESTING.md | 98 + docs/PUBLISHING.md | 82 + docs/SUPPORT.md | 43 + docs/USER-DOCUMENTATION.md | 226 + entitlements.mac.plist | 24 + forge.config.ts | 159 + forge.sidecar.ts | 168 + lib/gui/app/app.ts | 215 + .../drive-selector/drive-selector.tsx | 569 + .../drive-status-warning-modal.tsx | 83 + lib/gui/app/components/finish/finish.tsx | 123 + .../flash-another/flash-another.tsx | 32 + .../flash-results/flash-results.tsx | 244 + .../progress-button/progress-button.tsx | 136 + .../reduced-flashing-infos.tsx | 74 + .../components/safe-webview/safe-webview.tsx | 206 + lib/gui/app/components/settings/settings.tsx | 156 + .../source-selector/source-selector.tsx | 785 + lib/gui/app/components/svg-icon/svg-icon.tsx | 74 + .../target-selector-button.tsx | 157 + .../target-selector/target-selector.tsx | 181 + .../app/css/fonts/SourceSansPro-Regular.ttf | Bin 0 -> 269108 bytes .../app/css/fonts/SourceSansPro-SemiBold.ttf | Bin 0 -> 268280 bytes lib/gui/app/css/main.css | 66 + lib/gui/app/i18n.ts | 44 + lib/gui/app/i18n/README.md | 23 + lib/gui/app/i18n/en.ts | 161 + lib/gui/app/i18n/zh-CN.ts | 152 + lib/gui/app/i18n/zh-TW.ts | 154 + lib/gui/app/index.html | 10 + lib/gui/app/models/available-drives.ts | 33 + lib/gui/app/models/flash-state.ts | 162 + lib/gui/app/models/leds.ts | 259 + lib/gui/app/models/selection-state.ts | 128 + lib/gui/app/models/settings.ts | 126 + lib/gui/app/models/store.ts | 554 + lib/gui/app/modules/analytics.ts | 140 + lib/gui/app/modules/api.ts | 253 + lib/gui/app/modules/exception-reporter.ts | 29 + lib/gui/app/modules/image-writer.ts | 186 + lib/gui/app/modules/progress-status.ts | 87 + lib/gui/app/os/dialog.ts | 117 + lib/gui/app/os/notification.ts | 36 + .../open-external/services/open-external.ts | 32 + lib/gui/app/os/window-progress.ts | 66 + lib/gui/app/os/windows-network-drives.ts | 115 + lib/gui/app/pages/main/Flash.tsx | 350 + lib/gui/app/pages/main/MainPage.tsx | 408 + lib/gui/app/preload.ts | 12 + lib/gui/app/renderer.ts | 9 + lib/gui/app/styled-components.tsx | 335 + lib/gui/app/theme.ts | 126 + lib/gui/app/utils/etcher-pro-specific.ts | 73 + lib/gui/app/utils/middle-ellipsis.ts | 51 + lib/gui/assets/balena.svg | 1 + lib/gui/assets/drive.svg | 1 + lib/gui/assets/etcher.svg | 1 + lib/gui/assets/flash.svg | 1 + lib/gui/assets/image.svg | 1 + lib/gui/assets/love.svg | 1 + lib/gui/assets/raspberrypi.svg | 1 + lib/gui/assets/src.svg | 18 + lib/gui/assets/tgt.svg | 1 + lib/gui/etcher.ts | 310 + lib/gui/menu.ts | 140 + lib/gui/webapi.ts | 15 + lib/shared/drive-constraints.ts | 278 + lib/shared/errors.ts | 223 + lib/shared/exit-codes.ts | 20 + lib/shared/messages.ts | 193 + lib/shared/permissions.ts | 149 + lib/shared/sudo/darwin.ts | 98 + lib/shared/sudo/linux.ts | 104 + lib/shared/sudo/sudo-askpass.osascript-en.js | 21 + lib/shared/sudo/sudo-askpass.osascript-zh.js | 21 + lib/shared/sudo/windows.ts | 93 + lib/shared/supported-formats.ts | 41 + lib/shared/units.ts | 21 + lib/shared/utils.ts | 45 + lib/util/api.ts | 314 + lib/util/child-writer.ts | 199 + lib/util/drive-scanner.ts | 44 + lib/util/scanner.ts | 184 + lib/util/source-metadata.ts | 94 + lib/util/types/types.d.ts | 33 + npm-shrinkwrap.json | 27877 ++++++++++++++++ package.json | 153 + pkg-sidecar.json | 12 + repo.yml | 21 + tests/.eslintrc.yml | 19 + tests/data/wmic-output.txt | Bin 0 -> 178 bytes tests/gui/allow-renderer-process-reuse.ts | 11 + tests/gui/models/available-drives.spec.ts | 478 + tests/gui/models/flash-state.spec.ts | 620 + tests/gui/models/selection-state.spec.ts | 815 + tests/gui/models/settings.spec.ts | 97 + tests/gui/modules/image-writer.spec.ts | 149 + tests/gui/modules/progress-status.spec.ts | 101 + tests/gui/os/window-progress.spec.ts | 120 + tests/gui/os/windows-network-drives.spec.ts | 51 + tests/gui/utils/middle-ellipsis.spec.ts | 43 + tests/gui/window-config.json | 5 + tests/shared/drive-constraints.spec.ts | 1374 + tests/shared/errors.spec.ts | 700 + tests/shared/messages.spec.ts | 111 + tests/shared/supported-formats.spec.ts | 54 + tests/shared/units.spec.ts | 27 + tests/shared/utils.spec.ts | 127 + tests/test.e2e.ts | 7 + tsconfig.json | 21 + tsconfig.sidecar.json | 17 + wdio.conf.ts | 318 + webpack.config.ts | 109 + 148 files changed, 62726 insertions(+) create mode 100644 .dockerignore create mode 100644 .editorconfig create mode 100644 .eslintrc.js create mode 100644 .gitattributes create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/actions/publish/action.yml create mode 100644 .github/actions/test/action.yml create mode 100644 .github/workflows/flowzone.yml create mode 100644 .github/workflows/winget.yml create mode 100644 .gitignore create mode 100644 .nvmrc create mode 100644 .prettierrc.js create mode 100644 .versionbot/CHANGELOG.yml create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 README.wehub.md create mode 100644 after-install.tpl create mode 100755 assets/dmg/background.png create mode 100755 assets/dmg/background.tiff create mode 100755 assets/dmg/background@2x.png create mode 100755 assets/icon.icns create mode 100755 assets/icon.ico create mode 100755 assets/icon.png create mode 100644 assets/iconset/128x128.png create mode 100644 assets/iconset/16x16.png create mode 100644 assets/iconset/256x256.png create mode 100644 assets/iconset/32x32.png create mode 100644 assets/iconset/48x48.png create mode 100644 assets/iconset/512x512.png create mode 100644 docs/ARCHITECTURE.md create mode 100644 docs/COMMIT-GUIDELINES.md create mode 100644 docs/CONTRIBUTING.md create mode 100644 docs/FAQ.md create mode 100644 docs/MAINTAINERS.md create mode 100644 docs/MANUAL-TESTING.md create mode 100644 docs/PUBLISHING.md create mode 100644 docs/SUPPORT.md create mode 100644 docs/USER-DOCUMENTATION.md create mode 100644 entitlements.mac.plist create mode 100644 forge.config.ts create mode 100644 forge.sidecar.ts create mode 100644 lib/gui/app/app.ts create mode 100644 lib/gui/app/components/drive-selector/drive-selector.tsx create mode 100644 lib/gui/app/components/drive-status-warning-modal/drive-status-warning-modal.tsx create mode 100644 lib/gui/app/components/finish/finish.tsx create mode 100644 lib/gui/app/components/flash-another/flash-another.tsx create mode 100644 lib/gui/app/components/flash-results/flash-results.tsx create mode 100644 lib/gui/app/components/progress-button/progress-button.tsx create mode 100644 lib/gui/app/components/reduced-flashing-infos/reduced-flashing-infos.tsx create mode 100644 lib/gui/app/components/safe-webview/safe-webview.tsx create mode 100644 lib/gui/app/components/settings/settings.tsx create mode 100644 lib/gui/app/components/source-selector/source-selector.tsx create mode 100644 lib/gui/app/components/svg-icon/svg-icon.tsx create mode 100644 lib/gui/app/components/target-selector/target-selector-button.tsx create mode 100644 lib/gui/app/components/target-selector/target-selector.tsx create mode 100644 lib/gui/app/css/fonts/SourceSansPro-Regular.ttf create mode 100644 lib/gui/app/css/fonts/SourceSansPro-SemiBold.ttf create mode 100644 lib/gui/app/css/main.css create mode 100644 lib/gui/app/i18n.ts create mode 100644 lib/gui/app/i18n/README.md create mode 100644 lib/gui/app/i18n/en.ts create mode 100644 lib/gui/app/i18n/zh-CN.ts create mode 100644 lib/gui/app/i18n/zh-TW.ts create mode 100644 lib/gui/app/index.html create mode 100644 lib/gui/app/models/available-drives.ts create mode 100644 lib/gui/app/models/flash-state.ts create mode 100644 lib/gui/app/models/leds.ts create mode 100644 lib/gui/app/models/selection-state.ts create mode 100644 lib/gui/app/models/settings.ts create mode 100644 lib/gui/app/models/store.ts create mode 100644 lib/gui/app/modules/analytics.ts create mode 100644 lib/gui/app/modules/api.ts create mode 100644 lib/gui/app/modules/exception-reporter.ts create mode 100644 lib/gui/app/modules/image-writer.ts create mode 100644 lib/gui/app/modules/progress-status.ts create mode 100644 lib/gui/app/os/dialog.ts create mode 100644 lib/gui/app/os/notification.ts create mode 100644 lib/gui/app/os/open-external/services/open-external.ts create mode 100644 lib/gui/app/os/window-progress.ts create mode 100755 lib/gui/app/os/windows-network-drives.ts create mode 100644 lib/gui/app/pages/main/Flash.tsx create mode 100644 lib/gui/app/pages/main/MainPage.tsx create mode 100644 lib/gui/app/preload.ts create mode 100644 lib/gui/app/renderer.ts create mode 100644 lib/gui/app/styled-components.tsx create mode 100644 lib/gui/app/theme.ts create mode 100644 lib/gui/app/utils/etcher-pro-specific.ts create mode 100644 lib/gui/app/utils/middle-ellipsis.ts create mode 100644 lib/gui/assets/balena.svg create mode 100644 lib/gui/assets/drive.svg create mode 100644 lib/gui/assets/etcher.svg create mode 100644 lib/gui/assets/flash.svg create mode 100644 lib/gui/assets/image.svg create mode 100644 lib/gui/assets/love.svg create mode 100644 lib/gui/assets/raspberrypi.svg create mode 100644 lib/gui/assets/src.svg create mode 100644 lib/gui/assets/tgt.svg create mode 100644 lib/gui/etcher.ts create mode 100644 lib/gui/menu.ts create mode 100644 lib/gui/webapi.ts create mode 100644 lib/shared/drive-constraints.ts create mode 100644 lib/shared/errors.ts create mode 100644 lib/shared/exit-codes.ts create mode 100644 lib/shared/messages.ts create mode 100755 lib/shared/permissions.ts create mode 100644 lib/shared/sudo/darwin.ts create mode 100644 lib/shared/sudo/linux.ts create mode 100755 lib/shared/sudo/sudo-askpass.osascript-en.js create mode 100755 lib/shared/sudo/sudo-askpass.osascript-zh.js create mode 100644 lib/shared/sudo/windows.ts create mode 100644 lib/shared/supported-formats.ts create mode 100644 lib/shared/units.ts create mode 100755 lib/shared/utils.ts create mode 100644 lib/util/api.ts create mode 100644 lib/util/child-writer.ts create mode 100644 lib/util/drive-scanner.ts create mode 100644 lib/util/scanner.ts create mode 100644 lib/util/source-metadata.ts create mode 100644 lib/util/types/types.d.ts create mode 100644 npm-shrinkwrap.json create mode 100644 package.json create mode 100644 pkg-sidecar.json create mode 100644 repo.yml create mode 100644 tests/.eslintrc.yml create mode 100755 tests/data/wmic-output.txt create mode 100644 tests/gui/allow-renderer-process-reuse.ts create mode 100644 tests/gui/models/available-drives.spec.ts create mode 100644 tests/gui/models/flash-state.spec.ts create mode 100644 tests/gui/models/selection-state.spec.ts create mode 100644 tests/gui/models/settings.spec.ts create mode 100644 tests/gui/modules/image-writer.spec.ts create mode 100644 tests/gui/modules/progress-status.spec.ts create mode 100644 tests/gui/os/window-progress.spec.ts create mode 100644 tests/gui/os/windows-network-drives.spec.ts create mode 100644 tests/gui/utils/middle-ellipsis.spec.ts create mode 100644 tests/gui/window-config.json create mode 100644 tests/shared/drive-constraints.spec.ts create mode 100644 tests/shared/errors.spec.ts create mode 100644 tests/shared/messages.spec.ts create mode 100644 tests/shared/supported-formats.spec.ts create mode 100644 tests/shared/units.spec.ts create mode 100644 tests/shared/utils.spec.ts create mode 100644 tests/test.e2e.ts create mode 100644 tsconfig.json create mode 100644 tsconfig.sidecar.json create mode 100644 wdio.conf.ts create mode 100644 webpack.config.ts diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..98253ac --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +* +!requirements.txt diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..35e15b4 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,21 @@ +# editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[Makefile] +indent_style = tab + +[*.ts] +indent_style = tab + +[*.tsx] +indent_style = tab diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..0871a29 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,10 @@ +module.exports = { + extends: ["./node_modules/@balena/lint/config/.eslintrc.js"], + root: true, + ignorePatterns: ["node_modules/"], + rules: { + "@typescript-eslint/no-floating-promises": "off", + "@typescript-eslint/no-var-requires": "off", + "@typescript-eslint/ban-ts-comment": "off", + }, +}; diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..41277bc --- /dev/null +++ b/.gitattributes @@ -0,0 +1,64 @@ +# default +* text + +# Javascript files must retain LF line-endings (to keep eslint happy) +*.js text eol=lf +*.jsx text eol=lf +*.ts text eol=lf +*.tsx text eol=lf +# CSS and SCSS files must retain LF line-endings (to keep ensure-staged-sass.sh happy) +*.css text eol=lf +*.scss text eol=lf + +# Text files +Dockerfile* text +.dockerignore text +.editorconfig text +etcher text +.git* text +*.html text +*.json text eol=lf +*.cpp text +*.h text +*.gyp text +LICENSE text +Makefile text +*.md text +*.sh text +*.bat text +*.svg text +*.yml text +*.patch text +*.txt text +*.tpl text +CODEOWNERS text +*.plist text + +# Binary files (no line-ending conversions) +*.bz2 binary diff=hex +*.gz binary diff=hex +*.icns binary diff=hex +*.ico binary diff=hex +*.tiff binary diff=hex +*.img binary diff=hex +*.iso binary diff=hex +*.png binary diff=hex +*.bin binary diff=hex +*.elf binary diff=hex +*.xz binary diff=hex +*.zip binary diff=hex +*.dtb binary diff=hex +*.dtbo binary diff=hex +*.dat binary diff=hex +*.bin binary diff=hex +*.dmg binary diff=hex +*.rpi-sdcard binary diff=hex +*.wic binary diff=hex +*.foo binary diff=hex +*.eot binary diff=hex +*.otf binary diff=hex +*.woff binary diff=hex +*.woff2 binary diff=hex +*.ttf binary diff=hex +xz-without-extension binary diff=hex +wmic-output.txt binary diff=hex diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..a70dee2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,11 @@ +- **Etcher version:** +- **Operating system and architecture:** +- **Image flashed:** +- **What do you think should have happened:** +- **What happened:** +- **Do you see any meaningful error information in the DevTools?** + + + + + diff --git a/.github/actions/publish/action.yml b/.github/actions/publish/action.yml new file mode 100644 index 0000000..8821962 --- /dev/null +++ b/.github/actions/publish/action.yml @@ -0,0 +1,205 @@ +--- +name: package and publish GitHub (draft) release +# https://github.com/product-os/flowzone/tree/master/.github/actions +inputs: + json: + description: 'JSON stringified object containing all the inputs from the calling workflow' + required: true + secrets: + description: 'JSON stringified object containing all the secrets from the calling workflow' + required: true + + # --- custom environment + NODE_VERSION: + type: string + # Beware that native modules will be built for this version, + # which might not be compatible with the one used by pkg (see forge.sidecar.ts) + # https://github.com/vercel/pkg-fetch/releases + default: '20.19' + VERBOSE: + type: string + default: 'true' + +runs: + # https://docs.github.com/en/actions/creating-actions/creating-a-composite-action + using: 'composite' + steps: + - name: Download custom source artifact + uses: actions/download-artifact@v4 + with: + name: custom-${{ github.event.pull_request.head.sha || github.event.head_commit.id }}-${{ runner.os }}-${{ runner.arch }} + path: ${{ runner.temp }} + + - name: Extract custom source artifact + if: runner.os != 'Windows' + shell: bash + working-directory: . + run: tar -xf ${{ runner.temp }}/custom.tgz + + - name: Extract custom source artifact + if: runner.os == 'Windows' + shell: pwsh + working-directory: . + run: C:\"Program Files"\Git\usr\bin\tar.exe --force-local -xf ${{ runner.temp }}\custom.tgz + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: ${{ inputs.NODE_VERSION }} + cache: npm + + - name: Install host dependencies + if: runner.os == 'Linux' + shell: bash + run: sudo apt-get install -y --no-install-recommends fakeroot dpkg rpm + + # rpmbuild will strip binaries by default, which breaks the sidecar. + # Use a macro to override the "strip" to bypass stripping. + - name: Configure rpmbuild to not strip executables + if: runner.os == 'Linux' + shell: bash + run: echo '%__strip /usr/bin/true' > ~/.rpmmacros + + - name: Install host dependencies + if: runner.os == 'macOS' + # FIXME: Python 3.12 dropped distutils that node-gyp depends upon. + # This is a temporary workaround to make the job use Python 3.11 until + # we update to npm 10+. + uses: actions/setup-python@d27e3f3d7c64b4bbf8e4abfb9b63b83e846e0435 # v4 + with: + python-version: '3.11' + + # https://www.electron.build/code-signing.html + # https://dev.to/rwwagner90/signing-electron-apps-with-github-actions-4cof + - name: Import Apple code signing certificate + if: runner.os == 'macOS' + shell: bash + run: | + KEY_CHAIN=build.keychain + CERTIFICATE_P12=certificate.p12 + + # Recreate the certificate from the secure environment variable + echo $CERTIFICATE_P12_B64 | base64 --decode > $CERTIFICATE_P12 + + # Create a keychain + security create-keychain -p actions $KEY_CHAIN + + # Make the keychain the default so identities are found + security default-keychain -s $KEY_CHAIN + + # Unlock the keychain + security unlock-keychain -p actions $KEY_CHAIN + + security import $CERTIFICATE_P12 -k $KEY_CHAIN -P $CERTIFICATE_PASSWORD -T /usr/bin/codesign + + security set-key-partition-list -S apple-tool:,apple: -s -k actions $KEY_CHAIN + + # remove certs + rm -fr *.p12 + env: + CERTIFICATE_P12_B64: ${{ fromJSON(inputs.secrets).APPLE_SIGNING }} + CERTIFICATE_PASSWORD: ${{ fromJSON(inputs.secrets).APPLE_SIGNING_PASSWORD }} + + - name: Import Windows code signing certificate + if: runner.os == 'Windows' + id: import_win_signing_cert + shell: powershell + run: | + Set-Content -Path ${{ runner.temp }}/certificate.base64 -Value $env:SM_CLIENT_CERT_FILE_B64 + certutil -decode ${{ runner.temp }}/certificate.base64 ${{ runner.temp }}/Certificate_pkcs12.p12 + Remove-Item -path ${{ runner.temp }} -include certificate.base64 + + echo "certFilePath=${{ runner.temp }}/Certificate_pkcs12.p12" >> $GITHUB_OUTPUT + + env: + SM_CLIENT_CERT_FILE_B64: ${{ fromJSON(inputs.secrets).SM_CLIENT_CERT_FILE_B64 }} + + - name: Package release + shell: bash + # IMPORTANT: before making changes to this step please consult @engineering in balena's chat. + run: | + ## FIXME: causes issues with `xxhash` which tries to load a debug build which doens't exist and cannot be compiled + # if [[ '${{ inputs.VERBOSE }}' =~ on|On|Yes|yes|true|True ]]; then + # export DEBUG='electron-forge:*,sidecar' + # fi + + APPLICATION_VERSION="$(jq -r '.version' package.json)" + HOST_ARCH="$(echo "${RUNNER_ARCH}" | tr '[:upper:]' '[:lower:]')" + + if [[ "${RUNNER_OS}" == Linux ]]; then + PLATFORM=Linux + SHA256SUM_BIN=sha256sum + + elif [[ "${RUNNER_OS}" == macOS ]]; then + PLATFORM=Darwin + SHA256SUM_BIN='shasum -a 256' + + elif [[ "${RUNNER_OS}" == Windows ]]; then + PLATFORM=Windows + SHA256SUM_BIN=sha256sum + + # Install DigiCert Signing Manager Tools + curl --silent --retry 3 --fail https://one.digicert.com/signingmanager/api-ui/v1/releases/smtools-windows-x64.msi/download \ + -H "x-api-key:$SM_API_KEY" \ + -o smtools-windows-x64.msi + msiexec -i smtools-windows-x64.msi -qn + PATH="/c/Program Files/DigiCert/DigiCert One Signing Manager Tools:${PATH}" + smksp_registrar.exe list + smctl.exe keypair ls + smctl.exe windows certsync + /c/Windows/System32/certutil.exe -csp "DigiCert Signing Manager KSP" -key -user + + # (signtool.exe) https://github.com/actions/runner-images/blob/main/images/win/Windows2019-Readme.md#installed-windows-sdks + PATH="/c/Program Files (x86)/Windows Kits/10/bin/${runner_arch}:${PATH}" + + else + echo "ERROR: unexpected runner OS: ${RUNNER_OS}" + exit 1 + fi + + # Currently, we can only build for the host architecture. + npx electron-forge make + + echo "version=${APPLICATION_VERSION}" >> $GITHUB_OUTPUT + + # collect all artifacts from subdirectories under a common top-level directory + mkdir -p dist + find ./out/make -type f \( \ + -iname "*.zip" -o \ + -iname "*.dmg" -o \ + -iname "*.rpm" -o \ + -iname "*.deb" -o \ + -iname "*.AppImage" -o \ + -iname "*Setup.exe" \ + \) -ls -exec cp '{}' dist/ \; + + if [[ -n "${SHA256SUM_BIN}" ]]; then + # Compute and save digests. + cd dist/ + ${SHA256SUM_BIN} *.* >"SHA256SUMS.${PLATFORM}.${HOST_ARCH}.txt" + fi + env: + # ensure we sign the artifacts + NODE_ENV: production + # analytics tokens + SENTRY_TOKEN: https://739bbcfc0ba4481481138d3fc831136d@o95242.ingest.sentry.io/4504451487301632 + AMPLITUDE_TOKEN: 'balena-etcher' + # Apple notarization + XCODE_APP_LOADER_EMAIL: ${{ fromJSON(inputs.secrets).XCODE_APP_LOADER_EMAIL }} + XCODE_APP_LOADER_PASSWORD: ${{ fromJSON(inputs.secrets).XCODE_APP_LOADER_PASSWORD }} + XCODE_APP_LOADER_TEAM_ID: ${{ fromJSON(inputs.secrets).XCODE_APP_LOADER_TEAM_ID }} + # Windows signing + SM_CLIENT_CERT_PASSWORD: ${{ fromJSON(inputs.secrets).SM_CLIENT_CERT_PASSWORD }} + SM_CLIENT_CERT_FILE: '${{ runner.temp }}\Certificate_pkcs12.p12' + SM_HOST: ${{ fromJSON(inputs.secrets).SM_HOST }} + SM_API_KEY: ${{ fromJSON(inputs.secrets).SM_API_KEY }} + SM_CODE_SIGNING_CERT_SHA1_HASH: ${{ fromJSON(inputs.secrets).SM_CODE_SIGNING_CERT_SHA1_HASH }} + TIMESTAMP_SERVER: http://timestamp.digicert.com + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: gh-release-${{ github.event.pull_request.head.sha || github.event.head_commit.id }}-${{ runner.os }}-${{ runner.arch }} + path: dist + retention-days: 1 + if-no-files-found: error diff --git a/.github/actions/test/action.yml b/.github/actions/test/action.yml new file mode 100644 index 0000000..15ebe4a --- /dev/null +++ b/.github/actions/test/action.yml @@ -0,0 +1,98 @@ +--- +name: test release +# https://github.com/product-os/flowzone/tree/master/.github/actions +inputs: + json: + description: 'JSON stringified object containing all the inputs from the calling workflow' + required: true + secrets: + description: 'JSON stringified object containing all the secrets from the calling workflow' + required: true + + # --- custom environment + NODE_VERSION: + type: string + default: '20.19' + VERBOSE: + type: string + default: 'true' + +runs: + # https://docs.github.com/en/actions/creating-actions/creating-a-composite-action + using: 'composite' + steps: + # https://github.com/actions/setup-node#caching-global-packages-data + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: ${{ inputs.NODE_VERSION }} + cache: npm + + - name: Install host dependencies + if: runner.os == 'Linux' + shell: bash + run: | + sudo apt-get update && sudo apt-get install -y --no-install-recommends xvfb libudev-dev + cat < package.json | jq -r '.hostDependencies[][]' - | \ + xargs -L1 echo | sed 's/|//g' | xargs -L1 \ + sudo apt-get --ignore-missing install || true + + - name: Install host dependencies + if: runner.os == 'macOS' + # FIXME: Python 3.12 dropped distutils that node-gyp depends upon. + # This is a temporary workaround to make the job use Python 3.11 until + # we update to npm 10+. + uses: actions/setup-python@d27e3f3d7c64b4bbf8e4abfb9b63b83e846e0435 # v4 + with: + python-version: '3.11' + + - name: Test release + shell: bash + run: | + ## FIXME: causes issues with `xxhash` which tries to load a debug build which doens't exist and cannot be compiled + # if [[ '${{ inputs.VERBOSE }}' =~ on|On|Yes|yes|true|True ]]; then + # export DEBUG='electron-forge:*,sidecar' + # fi + + npm ci + + # as the shrinkwrap might have been done on mac/linux, this is ensure the package is there for windows + if [[ "$RUNNER_OS" == "Windows" ]]; then + npm i -D winusb-driver-generator + + # need to modifies @yao-pkg/pkg-fetch + # expected-shas.json and patches.json files to force use of nodejs v20.11.1 instead of latest minor (v20.19.4 at the time of writing). + # this is required for Windows compatibility as 20.15.1 introduced a regression that breaks the flasher on Windows. + # As soon as nodejs the fix is backported to node20 and, or node 22, this script can be removed: https://github.com/nodejs/node/pull/55623 + + # Add entry to expected-shas.json + sed -i 's/}$/,\n "node-v20.11.1-win-x64": "140c377c2c91751832e673cb488724cbd003f01aa237615142cd2907f34fa1a2"\n}/' node_modules/@yao-pkg/pkg-fetch/lib-es5/expected-shas.json + + # Replace any "v20..." key with "v20.11.1" in patches.json (keeps value) + sed -i -E 's/"v20[^"]*":/"v20.11.1":/' node_modules/@yao-pkg/pkg-fetch/patches/patches.json + fi + + npm run lint + npm run package + npm run wdio # test stage, note that it requires the package to be done first + + env: + # https://www.electronjs.org/docs/latest/api/environment-variables + ELECTRON_NO_ATTACH_CONSOLE: 'true' + + - name: Compress custom source + if: runner.os != 'Windows' + shell: bash + run: tar -acf ${{ runner.temp }}/custom.tgz . + + - name: Compress custom source + if: runner.os == 'Windows' + shell: pwsh + run: C:\"Program Files"\Git\usr\bin\tar.exe --force-local -acf ${{ runner.temp }}\custom.tgz . + + - name: Upload custom artifact + uses: actions/upload-artifact@v4 + with: + name: custom-${{ github.event.pull_request.head.sha || github.event.head_commit.id }}-${{ runner.os }}-${{ runner.arch }} + path: ${{ runner.temp }}/custom.tgz + retention-days: 1 diff --git a/.github/workflows/flowzone.yml b/.github/workflows/flowzone.yml new file mode 100644 index 0000000..3d8369d --- /dev/null +++ b/.github/workflows/flowzone.yml @@ -0,0 +1,41 @@ +name: Flowzone +on: + pull_request: + types: [opened, synchronize, closed] + branches: [main, master] + # allow external contributions to use secrets within trusted code + pull_request_target: + types: [opened, synchronize, closed] + branches: [main, master] +jobs: + flowzone: + name: Flowzone + uses: product-os/flowzone/.github/workflows/flowzone.yml@master + # prevent duplicate workflows and only allow one `pull_request` or `pull_request_target` for + # internal or external contributions respectively + if: | + (github.event.pull_request.head.repo.full_name == github.repository && github.event_name == 'pull_request') || + (github.event.pull_request.head.repo.full_name != github.repository && github.event_name == 'pull_request_target') + secrets: inherit + with: + custom_test_matrix: > + { + "os": [ + ["ubuntu-22.04"], + ["windows-2022"], + ["macos-14-large"], + ["macos-latest-xlarge"] + ] + } + custom_publish_matrix: > + { + "os": [ + ["ubuntu-22.04"], + ["windows-2022"], + ["macos-14-large"], + ["macos-latest-xlarge"] + ] + } + restrict_custom_actions: false + github_prerelease: true + cloudflare_website: 'etcher' diff --git a/.github/workflows/winget.yml b/.github/workflows/winget.yml new file mode 100644 index 0000000..2de9653 --- /dev/null +++ b/.github/workflows/winget.yml @@ -0,0 +1,14 @@ +name: Publish to WinGet +on: + release: + types: [released] +jobs: + publish: + runs-on: windows-latest # action can only be run on windows + steps: + - uses: vedantmgoyal2009/winget-releaser@v2 + with: + identifier: Balena.Etcher + # matches something like "balenaEtcher-1.19.0.Setup.exe" + installers-regex: 'balenaEtcher-[\d.-]+\.Setup.exe$' + token: ${{ secrets.WINGET_PAT }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f523e5f --- /dev/null +++ b/.gitignore @@ -0,0 +1,123 @@ + +# -- ADD NEW ENTRIES AT THE END OF THE FILE --- + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock +.DS_Store + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# Webpack +.webpack/ + +# Vite +.vite/ + +# Electron-Forge +out/ + +# ---- Do not modify entries above this line ---- + +# Build artifacts +dist/ + +# Certificates +*.spc +*.pvk +*.p12 +*.cer +*.crt +*.pem + +# Secrets +.gitsecret/keys/random_seed +!*.secret +secrets/APPLE_SIGNING_PASSWORD.txt +secrets/WINDOWS_SIGNING_PASSWORD.txt +secrets/XCODE_APP_LOADER_PASSWORD.txt +secrets/WINDOWS_SIGNING.pfx + +# Image stream output directory +/tests/image-stream/output + +#local development +.yalc +yalc.lock \ No newline at end of file diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..3c03207 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +18 diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 0000000..1f1c368 --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,6 @@ +const fs = require("fs"); +const path = require("path"); + +module.exports = JSON.parse( + fs.readFileSync(path.join(__dirname, "node_modules", "@balena", "lint", "config", ".prettierrc"), "utf8"), +); diff --git a/.versionbot/CHANGELOG.yml b/.versionbot/CHANGELOG.yml new file mode 100644 index 0000000..57c31f7 --- /dev/null +++ b/.versionbot/CHANGELOG.yml @@ -0,0 +1,13983 @@ +- commits: + - subject: Fix MacOS x86 build by switching to the macos-14-large GH runner + hash: faab6b2fb0aef21f78d9a84240a0032327e1f9d9 + body: "" + footer: + Change-type: patch + change-type: patch + See: https://balena.fibery.io/Work/Project/2581 + see: https://balena.fibery.io/Work/Project/2581 + author: Thodoris Greasidis + nested: [] + version: 2.1.6 + title: "" + date: 2026-05-13T16:39:40.430Z +- commits: + - subject: Replace the EOL macos-13 test runners with macos-14 + hash: 835222525f77279e0858328a57390de3bb761805 + body: "" + footer: + Change-type: patch + change-type: patch + See: https://github.blog/changelog/2025-09-19-github-actions-macos-13-runner-image-is-closing-down/ + see: https://github.blog/changelog/2025-09-19-github-actions-macos-13-runner-image-is-closing-down/ + author: Thodoris Greasidis + nested: [] + - subject: Add libgdk-pixbuf dependency alternatives to fix Ubuntu 26.04 + installation + hash: ccf063f9cb5d7ab8c2503c98adbe1439f7d0ab95 + body: "" + footer: + Change-type: patch + change-type: patch + author: Thodoris Greasidis + nested: [] + version: 2.1.5 + title: "" + date: 2026-05-07T12:55:07.475Z +- commits: + - subject: "patch: fix ubuntu 24 build and flash issues - bump electron-forge to + 7.8.1 - bump electron to 37.2.4 - stop producing broken appimage" + hash: c824a60e5dc9a78b92679fa8915e3ddad4127c05 + body: "" + footer: {} + author: Edwin Joassart + nested: [] + - subject: "patch: fix windows build and flash issues - downgrade flasher's node + to 20.11.1 on windows - bump windows GHA runner to 2022 - bump + winusb-driver-generator to 2.1.9" + hash: 2a470f5e6c864ea161188f1e1a01d4baeba6c310 + body: "" + footer: {} + author: Edwin Joassart + nested: [] + - subject: "patch: refactor permission code" + hash: f3123f3cbe0159c624412ec2f162d01e079d314e + body: "" + footer: {} + author: Edwin Joassart + nested: [] + version: 2.1.4 + title: "" + date: 2025-07-29T12:17:33.739Z +- commits: + - subject: Remove stale secrets + hash: c2fc36971c9460eac6bd02cfc7bdcabec7b97a6d + body: "" + footer: + change-type: patch + author: Anton Belodedenko + nested: [] + version: 2.1.3 + title: "" + date: 2025-05-15T18:09:55.848Z +- commits: + - subject: "patch: remove analytics" + hash: aa6d526fea010d181f49dd81ae3bdaefb8d1938e + body: "" + footer: {} + author: Edwin Joassart + nested: [] + version: 2.1.2 + title: "" + date: 2025-05-08T08:51:44.810Z +- commits: + - subject: "patch: fix signin windows artifacts" + hash: a1e9be2f94629447e02994e52e12c67ec98de831 + body: "" + footer: {} + author: Edwin Joassart + nested: [] + version: 2.1.1 + title: "" + date: 2025-05-05T17:19:50.443Z +- commits: + - subject: Add informational notice about how to disable analytics collection + hash: aac092fd4df8750024c082b25dcbd0ae6ee618fd + body: "" + footer: + Change-type: minor + change-type: minor + author: myarmolinsky + nested: [] + version: 2.1.0 + title: "" + date: 2025-02-27T16:16:57.036Z +- commits: + - subject: "major: build on ubuntu 22 and macos 13" + hash: 039a022353d1980ef9ddd19166515c531e48aba4 + body: "" + footer: {} + author: Edwin Joassart + nested: [] + version: 2.0.0 + title: "" + date: 2025-02-20T14:27:01.338Z +- commits: + - subject: "patch: bump etcher-sdk to 9.1.2" + hash: c726b51dca3383c76f4bf824fd5d594ac3069180 + body: "" + footer: {} + author: Edwin Joassart + nested: [] + version: 1.19.25 + title: "" + date: 2024-10-10T10:03:29.519Z +- commits: + - subject: "patch: etcher-util is corrupted in RPM package" + hash: e43ee788ec5ec49e105ff804206919bb10a59ea7 + body: | + rpmbuild strips executables by default when generating an rpm packge. + This was causing the JavaScript code bundled in the etcher-util file + to be removed, causing "Pkg: Error reading from file." whenever + etcher-util was called. + + This in turn caused balena-etcher to generate the error message + `Error: (0, h.requestMetadata) is not a function` when attempting + to write an SD card. + + This fixes the issue for RPM builds by replacing the `strip` command + with `true` so that rpmbuild no longer strips the executables and + the embeded code stays intact. + + See: https://github.com/balena-io/etcher/issues/4150 + footer: + Signed-off-by: Richard Glidden + signed-off-by: Richard Glidden + author: Richard Glidden + nested: [] + version: 1.19.24 + title: "" + date: 2024-10-09T14:22:56.623Z +- commits: + - subject: "patch: remove gconf2 libgconf-2-4 deps" + hash: 2ed779ef371db367e4e413c9d0d08fcd738edb5b + body: "Closes #4096" + footer: {} + author: Marc-Aurèle Brothier + nested: [] + version: 1.19.23 + title: "" + date: 2024-10-09T13:52:54.936Z +- commits: + - subject: Replace deprecated Flowzone inputs + hash: 52d396aa7ea9ae1ef6d68151f582f04f57191b14 + body: "" + footer: + Change-type: patch + change-type: patch + author: Kyle Harding + nested: [] + version: 1.19.22 + title: "" + date: 2024-07-18T18:12:56.368Z +- commits: + - subject: "patch: fix missing windows dependency" + hash: 8dad81ae34b8d71f3d4f7151ee60717e6207ccd8 + body: "" + footer: {} + author: Edwin Joassart + nested: [] + - subject: "patch: fix missing windows dependency" + hash: d28719daf249f2994acdf94b4bb7ea937ffcab9b + body: "" + footer: {} + author: Edwin Joassart + nested: [] + - subject: "patch: fix missing windows dependency" + hash: 98db4df0dc147e5fec9180c50f4e21acf1fd0a58 + body: "" + footer: {} + author: Edwin Joassart + nested: [] + version: 1.19.21 + title: "" + date: 2024-05-30T15:00:35.706Z +- commits: + - subject: "patch: fix missing windows dependency" + hash: c4d3f8db8769418925a9909ac700edc5f425a068 + body: "" + footer: {} + author: Edwin Joassart + nested: [] + version: 1.19.20 + title: "" + date: 2024-05-30T10:17:29.075Z +- commits: + - subject: "patch: add sentry debug flag" + hash: 8223130e8dfce180481550d77f022064255601e4 + body: "" + footer: {} + author: Edwin Joassart + nested: [] + version: 1.19.19 + title: "" + date: 2024-05-28T12:09:51.167Z +- commits: + - subject: "patch: fix Sentry DSN for main process" + hash: 4ffda6e208a6e2f109f652d39e1248bec23a2ddf + body: "" + footer: {} + author: Edwin Joassart + nested: [] + version: 1.19.18 + title: "" + date: 2024-05-22T13:28:03.659Z +- commits: + - subject: "patch: fix injection of analytics key at build time" + hash: e94767aca7b07e674bd60176ef77c11440131ace + body: "" + footer: {} + author: JOASSART Edwin + nested: [] + version: 1.19.17 + title: "" + date: 2024-05-09T06:33:45.091Z +- commits: + - subject: "patch: hold request for metadata while waiting for flasher" + hash: 2dfa795129e287f887b9ea02f2eca717575d27ac + body: "" + footer: {} + author: Edwin Joassart + nested: [] + version: 1.19.16 + title: "" + date: 2024-04-26T14:33:19.111Z +- commits: + - subject: "patch: bump etcher-sdk to 9.0.11 to fix url loading using http/2" + hash: cb03fb83754f38d647fc951b94470725b46b2b31 + body: "" + footer: {} + author: Edwin Joassart + nested: [] + version: 1.19.15 + title: "" + date: 2024-04-26T13:26:57.047Z +- commits: + - subject: "patch: pretty-bytes to 6.1.1" + hash: fa642270f7153f14e45ee03a73bad1f0797cbd51 + body: "" + footer: {} + author: JOASSART Edwin + nested: [] + version: 1.19.14 + title: "" + date: 2024-04-25T21:11:35.350Z +- commits: + - subject: "patch: use etcher icon as loading for windows installer" + hash: bc3340960a765e99f2f02bc21adace91d228d26f + body: "" + footer: {} + author: Edwin Joassart + nested: [] + - subject: "patch: fix windows squirrel install" + hash: d498248a0f1416045b836646b72c7b4c588119d3 + body: "" + footer: {} + author: Edwin Joassart + nested: [] + version: 1.19.13 + title: "" + date: 2024-04-25T19:02:23.576Z +- commits: + - subject: "patch: bump minors & patch" + hash: afd659f9e586e012be7e3b02490d14a8ac64bb35 + body: "" + footer: {} + author: Edwin Joassart + nested: [] + - subject: "patch: bump @electron-forge/* to 7.4.0" + hash: ffdeccf7efd1412a2e2838fd07df5b21f1233efe + body: "" + footer: {} + author: Edwin Joassart + nested: [] + - subject: "patch: bump electron to 30.0.1 & @electron/remote to 2.1.2" + hash: 37ac323e10c07db35a7e47b576d07e1d4d41a470 + body: "" + footer: {} + author: Edwin Joassart + nested: [] + - subject: "patch: npm upgrade" + hash: 7c8f3c35d3d159e7be73442ab215019dc2388f54 + body: "" + footer: {} + author: Edwin Joassart + nested: [] + - subject: "patch: bump @balena/lint to 8.0.2 and fix formating" + hash: 4aa4140d65189920938c42c41a6a781c97148c8a + body: "" + footer: {} + author: Edwin Joassart + nested: [] + - subject: "patch: fix pretty-bytes imports" + hash: 064261107954dd64d03f94d6aeffd95cd2211df0 + body: "" + footer: {} + author: Edwin Joassart + nested: [] + - subject: "patch: bump etcher-sdk to 9.0.9" + hash: 2f4a12a48facf0634ed457fe6ed7c50e21b419ee + body: "" + footer: {} + author: Edwin Joassart + nested: [] + version: 1.19.12 + title: "" + date: 2024-04-25T16:47:43.024Z +- commits: + - subject: "patch: setup wdio and port (most) tests" + hash: a661d102bc94bf2707f01958d1e9d260efc06c14 + body: "" + footer: {} + author: Edwin Joassart + nested: [] + version: 1.19.11 + title: "" + date: 2024-04-25T13:00:13.805Z +- commits: + - subject: "patch: remove node-ipc and tests" + hash: ccc31bb9aaba8df88b2af612824d9106051e2804 + body: "" + footer: {} + author: Edwin Joassart + nested: [] + - subject: "patch: switch api; use ws; integrate sudo-prompt - switch api roles + flow - use websocket instead of node-ipc - integrate; modernize; + simplify and deprecate sudo-prompt" + hash: b3e33824ed1f70719b04f18dcb7f7dd76451b7f6 + body: "" + footer: {} + author: Edwin Joassart + nested: [] + - subject: "patch: refactor api to use a single topic" + hash: 6582260355fcc5280932bee771602fbfb5190619 + body: "" + footer: {} + author: Edwin Joassart + nested: [] + - subject: "patch: set require node engine to 20" + hash: b1d2bdaa06bfb35f4a66d92275ca21c731d1cf8e + body: "" + footer: {} + author: Edwin Joassart + nested: [] + version: 1.19.10 + title: "" + date: 2024-04-23T10:28:00.127Z +- commits: + - subject: "patch: prevent rebuild of native deps by @electron/rebuild" + hash: 003abfb88f2c7bff0ee291828f3815c738340afa + body: "" + footer: {} + author: Edwin Joassart + nested: [] + version: 1.19.9 + title: "" + date: 2024-04-22T10:20:10.534Z +- commits: + - subject: "patch: replace deprecated pkg with yao-pkg and bump etcher-util node v + to 20.10" + hash: c696c389c9988c75ad9ccc472bdac7edefe762ed + body: "" + footer: {} + author: Edwin Joassart + nested: [] + version: 1.19.8 + title: "" + date: 2024-04-22T09:37:37.561Z +- commits: + - subject: "patch: fix formating" + hash: 1a9a3d2cdc5642a754b73628f4ae2636e3ffd8eb + body: "" + footer: {} + author: Edwin Joassart + nested: [] + - subject: "patch: configure prettier in the project to use balena-lint + configuration" + hash: faeaa58ec548e47abaf30b2498ab145e7c0c6f76 + body: "" + footer: {} + author: Edwin Joassart + nested: [] + version: 1.19.7 + title: "" + date: 2024-04-22T06:52:18.878Z +- commits: + - subject: "patch: fix win signature process" + hash: f629e6d53b5329cd7e8105050df042f3873a35ee + body: "" + footer: {} + author: Edwin Joassart + nested: [] + version: 1.19.6 + title: "" + date: 2024-04-19T15:59:28.200Z +- commits: + - subject: Replace deprecated flowzone input tests_run_on + hash: bec0e50741bfeda63ca9785217576613f74ca043 + body: | + The `custom_runs_on` array supports multiple runner labels + in nested arrays. + footer: + Change-type: patch + change-type: patch + Signed-off-by: Kyle Harding + signed-off-by: Kyle Harding + author: Kyle Harding + nested: [] + version: 1.19.5 + title: "" + date: 2024-02-14T19:51:16.321Z +- commits: + - subject: "patch: remove screensaver error when not on etcher-pro" + hash: 196fd8ae24de2a23ebaeae736c6ca41007162fa1 + body: "" + footer: {} + author: Edwin Joassart + nested: [] + - subject: "patch: fix typo in IPC server id" + hash: 5d436992423961258ad861c01e3b9b30f3317aab + body: "" + footer: {} + author: Edwin Joassart + nested: [] + version: 1.19.4 + title: "" + date: 2024-01-26T17:29:27.301Z +- commits: + - subject: Update dependencies + hash: 0f2b4dbc106c55fe104f0b10e62c35c16bcfe9b3 + body: > + - upgrade pretty_bytes to 6.1.1 + + - upgrade electron-remote to 2.1.0 + + - upgrade semver to 7.5.4 + @types/semver to 7.5.6 + + - upgrade chai to 4.3.11 + @types/chai to 4.3.10 + + - upgrade mocha to 10.2.0 + @types/mocha to 10.0.6 + + - upgrade sinon to 17.0.1 + @types/sinon to 17.0.2 + + - remove useless @types + + - upgrade @svgr/webpack to 8.1.0 + + - upgrade @sentry/electron to 4.15.1 + + - upgrade tslib to 2.6.2 + + - upgrade immutable to 4.3.4 + + - upgrade redux to 4.2.1 + + - upgrade ts-node to 10.9.2 & ts-loader to 9.5.1 + + - remove mini-css-extract-plugin + + - upgrade husky to 8.0.3 + + - upgrade uuid to 9.0.1 + + - upgrade lint-staged to 15.2.1 + + - upgrade @types/node to 18.11.9 + + - upgrade @fortawesome/fontawesome-free to 6.5.1 + + - upgrade i18next to 23.7.8 & react-i18next to 11.18.6 + + - bump react, react-dom + related @types to 17.0.2 and rendition to + 35.1.0 + + - fix getuid for ts + + - fix @types/react being in wrong deps + + - upgrade @types/tmp to 0.2.6 + + - upgrade typescript to 5.3.3 + + - upgrade @types/mime-types to 2.1.4 + + - remove d3 from deps + + - upgrade electron-updater to 6.1.7 + + - upgrade rendition to 35.1.2 + + - upgrade node-ipc to 9.2.3 + + - upgrade @types/node-ipc to 9.2.3 + + - upgrade electron to 27.1.3 + + - upgrade @electron-forge/* to 7.2.0 + + - upgrade @reforged/marker-appimage to 3.3.2 + + - upgrade style-loader to 3.3.3 + + - upgrade balena-lint to 7.2.4 + + - run CI with node 18.19 + + - add xxhash-addon to sidecar assets + footer: + Change-type: patch + change-type: patch + author: Edwin Joassart + nested: [] + version: 1.19.3 + title: "" + date: 2023-12-22T16:13:00.924Z +- commits: + - subject: "fix: typos" + hash: aaac1336702b7ac4a07992f41db4f0bcdb931c70 + body: "" + footer: + Change-type: patch + change-type: patch + author: Rotzbua + nested: [] + version: 1.19.2 + title: "" + date: 2023-12-22T12:57:35.441Z +- commits: + - subject: "patch: update winget-releaser v2" + hash: ea184eb6352b7988c6ab1f439d30c297610cd84e + body: "" + footer: {} + author: Vedant + nested: [] + version: 1.19.1 + title: "" + date: 2023-12-22T08:12:34.451Z +- commits: + - subject: Use native ARM runner for Apple Silicon builds + hash: 01a96bb6de1ff00d20f7784469dd05286069e014 + body: "" + footer: + Change-type: minor + change-type: minor + author: Akis Kesoglou + nested: [] + - subject: Calculate and upload build artifact sha256 checksums + hash: 2e3a75e685258961bc8efdb95dde12727b93a04a + body: "" + footer: + Change-type: minor + change-type: minor + author: Akis Kesoglou + nested: [] + - subject: Migrate build pipeline to Electron Forge + hash: bd33c5b092cb5224c8dfc4d5a2caf4684cee161d + body: "" + footer: + Change-type: minor + change-type: minor + author: Akis Kesoglou + nested: [] + version: 1.19.0 + title: "" + date: 2023-12-21T16:41:57.426Z +- commits: + - subject: Remove repo config from flowzone.yml + hash: ecb24dad251fbb9b3f92e5b404b66aedd155a584 + body: | + This functionality is being deprecated in Flowzone. + + See: https://github.com/product-os/flowzone/pull/833 + footer: + Change-type: patch + change-type: patch + Signed-off-by: Kyle Harding + signed-off-by: Kyle Harding + author: Kyle Harding + nested: [] + - subject: Update actions/upload-artifact to v4 + hash: a970f55b555f69c5fcb40374eb50ad7b98cc8f96 + body: | + Also ensure we are generating unique artifact names on upload. + footer: + Change-type: patch + change-type: patch + Signed-off-by: Kyle Harding + signed-off-by: Kyle Harding + See: https://github.com/product-os/flowzone/pull/827 + see: https://github.com/product-os/flowzone/pull/827 + author: Kyle Harding + nested: [] + version: 1.18.14 + title: "" + date: 2023-12-20T16:23:00.875Z +- commits: + - subject: "patch: upgrade to electron 25" + hash: f38bca290fe26121bed58d1131265e1aa350ddb5 + body: "" + footer: {} + author: Edwin Joassart + nested: [] + - subject: "patch: refactor scanner, loader and flasher out of gui + upgrade to + electron 25" + hash: fb8ed5b529e22bc9e766bfe99c2b6955ed695b58 + body: "" + footer: {} + author: Edwin Joassart + nested: [] + version: 1.18.13 + title: "" + date: 2023-10-16T13:32:26.738Z +- commits: + - subject: Update instructions for installing deb file + hash: acab03ad77a1c1901d0c8a65999e93c1d27169a0 + body: "" + footer: + Change-type: patch + change-type: patch + author: Jorge Capona + nested: [] + version: 1.18.12 + title: "" + date: 2023-07-19T10:24:22.407Z +- commits: + - subject: "fix: prevent stealing window focus from auth dialog" + hash: f716c74ef7cb164b4d825828e4e46033484ad9af + body: "" + footer: + Change-type: patch + change-type: patch + author: leadpogrommer + nested: [] + version: 1.18.11 + title: "" + date: 2023-07-13T14:31:40.021Z +- commits: + - subject: "spelling: validates" + hash: 06d246e3fd1c573b9e04d23ab3bc3c4036fb9859 + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: Josh Soref + signed-off-by: Josh Soref + author: Josh Soref + nested: [] + - subject: "spelling: undefined" + hash: 67b26a5b69f819066c6419d3d915846b63fdbcf0 + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: Josh Soref + signed-off-by: Josh Soref + author: Josh Soref + nested: [] + - subject: "spelling: except if" + hash: b4b9db7ffa2104c19e7bd079e4f394a817f40bc0 + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: Josh Soref + signed-off-by: Josh Soref + author: Josh Soref + nested: [] + version: 1.18.10 + title: "" + date: 2023-07-12T11:21:59.231Z +- commits: + - subject: Fix opening links from within SafeWebView + hash: 497bb0e2cbefad3e9a1188ee5df49cf61f6bd6e4 + body: "" + footer: + Change-type: patch + change-type: patch + author: Akis Kesoglou + nested: [] + version: 1.18.9 + title: "" + date: 2023-07-12T09:07:17.666Z +- commits: + - subject: "Patch: Fix Support link" + hash: 882b385c88111a192e5f37e20c1c8aeca9950b21 + body: "" + footer: {} + author: Oliver Plummer + nested: [] + version: 1.18.8 + title: "" + date: 2023-04-26T09:57:46.155Z +- commits: + - subject: "patch: update docs to remove cloudsmith install instructions for linux" + hash: 02a406711852cf237e41da4cd39350d8acc1f0b0 + body: "" + footer: {} + author: Edwin Joassart + nested: [] + version: 1.18.7 + title: "" + date: 2023-04-25T15:25:35.584Z +- commits: + - subject: add-flash-with-etcher-to-docs + hash: 856b426dc98925f5e339976a5cac144f4bb4ea59 + body: "" + footer: + Change-type: patch + change-type: patch + author: Lizzie Epton + nested: [] + version: 1.18.6 + title: "" + date: 2023-03-21T13:24:18.265Z +- commits: + - subject: "patch: add apt-get update in flowzone preinstall" + hash: 0d9ac710880e6b9413b09e4c35a505034d1e9d51 + body: libudev package has changed and cannot be installed if we not update apt + cache + footer: {} + author: Edwin Joassart + nested: [] + version: 1.18.5 + title: "" + date: 2023-03-09T11:30:34.540Z +- commits: + - subject: "patch: bump etcher-sdk to 8.3.1" + hash: bf0360e7f46ac620f95021e0c48a3a04d302e725 + body: "" + footer: {} + author: JOASSART Edwin + nested: [] + version: 1.18.4 + title: "" + date: 2023-03-02T17:31:31.788Z +- commits: + - subject: fix-typo + hash: 496f131c4b024dfcd17fde5173016f70c0d0599c + body: "" + footer: + Change-type: patch + change-type: patch + author: Lizzie Epton + nested: [] + - subject: edits-to-info-about-efp + hash: f582b0215c2cf66acf652afdaa47353e1a7eac07 + body: "" + footer: + Change-type: patch + change-type: patch + author: Lizzie Epton + nested: [] + - subject: Add reference to etcher-efp in publishing.md + hash: 4c3c4babea5efdadbed7ba0df85f08b68a7b6f20 + body: | + Add reference to etcher-efp in publishing.md + footer: + Change-type: patch + change-type: patch + author: Edwin Joassart + nested: [] + version: 1.18.3 + title: "" + date: 2023-02-22T12:12:40.270Z +- commits: + - subject: "patch: organize docs" + hash: e479b95d72bed6a50ae6a971598a18d8a7562f0d + body: "" + footer: {} + author: mcraa + nested: [] + - subject: "patch: actualized develop guide" + hash: 926ff2b7549d8b187b18ee452ce48c62f6cd3531 + body: "" + footer: {} + author: mcraa + nested: [] + - subject: "patch: updated commit message guide" + hash: 394b64319de11b1010b8acfe160de13a6f3851cd + body: "" + footer: {} + author: mcraa + nested: [] + - subject: add-item-from-FAQs + hash: 96fa53b6ee4ec7a29522df488b927074c0f301ca + body: "" + footer: + Change-type: patch + change-type: patch + author: Lizzie Epton + nested: [] + - subject: "patch: removed gt characters from contributing guide" + hash: 9b54e2af0b9356bb73e197cccbcc2ff89673361f + body: "" + footer: {} + author: mcraa + nested: [] + - subject: "patch: added docosaurus site name" + hash: b01cf3c2e1c3a7a234c8b957bd570ecdca81e0c1 + body: "" + footer: {} + author: mcraa + nested: [] + version: 1.18.2 + title: "" + date: 2023-02-21T13:17:09.606Z +- commits: + - subject: "patch: use @electron/remote for locating rpiboot files" + hash: 04fa3dcd8c619dce927221cef5799b5210354d2e + body: "" + footer: {} + author: mcraa + nested: [] + version: 1.18.1 + title: "" + date: 2023-02-15T14:54:45.951Z +- commits: + - subject: Update to Electron 19 + hash: c11db0a2797a6b1093dd3fa6f55bee5f100c6da4 + body: "" + footer: + Change-type: minor + change-type: minor + author: Akis Kesoglou + nested: [] + - subject: Remove Spectron and related (low-value) tests + hash: 6f7570d265e4b457afe832d00e5f45e0bf5a8a53 + body: > + Spectron is long deprecated and abandoned and the browser tests are so + rudimentary that it’s no longer worth having them around. We will + introduce a proper browser-based test suite in the short term — it’s a + project in progress. + footer: + Change-type: minor + change-type: minor + author: Akis Kesoglou + nested: [] + version: 1.18.0 + title: "" + date: 2023-02-14T18:07:05.870Z +- commits: + - subject: Update to Electron 17 and Node 16 + hash: 3c1dd6ce29ddf43ef35e58236d25713fa2026c10 + body: | + This is the latest Electron version officially supported by Spectron. + footer: + Change-type: minor + change-type: minor + author: Akis Kesoglou + nested: [] + version: 1.17.0 + title: "" + date: 2023-02-14T16:18:54.834Z +- commits: + - subject: Update to Electron 14 + hash: df7854111a901b620e3284edf10768d308ce7755 + body: "" + footer: + Change-type: minor + change-type: minor + author: Akis Kesoglou + nested: [] + version: 1.16.0 + title: "" + date: 2023-02-14T12:40:40.820Z +- commits: + - subject: "patch: app: i18n: Translation: Update zh-TW strings * Improve + translate. * Sync layout with English strings ts file." + hash: b51418814f5ef48d09e3157c92bda5eab173dbd5 + body: "" + footer: + Signed-off-by: Edward Wu + signed-off-by: Edward Wu + author: Edward Wu + nested: [] + version: 1.15.6 + title: "" + date: 2023-02-13T11:23:13.079Z +- commits: + - subject: revert auto-update feature + hash: e6d33eda2b8f767679a43f8056e20098b0f2f6d9 + body: "" + footer: + Change-type: patch + change-type: patch + author: JOASSART Edwin + nested: [] + version: 1.15.5 + title: "" + date: 2023-02-03T14:25:19.611Z +- commits: + - subject: Switch to `@electron/remote` + hash: 7ee174edcecbfc2d7370db6d4185b3ee4eedbe28 + body: > + Electron 12 deprecated `electron.remote` and the functionality was + removed in Electron 14, but became available as a separate + `@electron/remote` module. This commit makes the transition to the + external module as an intermediary step to enable updating to a newer + Electron version. + footer: + Change-type: patch + change-type: patch + author: Akis Kesoglou + nested: [] + version: 1.15.4 + title: "" + date: 2023-02-02T18:26:45.877Z +- commits: + - subject: move EFP & success-banner to efp.balena.io + hash: a140faaebe087a96387604f12c3510ee22374d92 + body: "" + footer: + Change-type: patch + change-type: patch + author: Edwin Joassart + nested: [] + version: 1.15.3 + title: "" + date: 2023-02-02T17:23:16.454Z +- commits: + - subject: Remove configuration remote update + hash: 85a49a221fa7fc9b1943dc8ed43b29995f9d8260 + body: "" + footer: + Change-type: patch + change-type: patch + author: Edwin Joassart + nested: [] + version: 1.15.2 + title: "" + date: 2023-02-02T13:05:01.310Z +- commits: + - subject: Remove redundant resinci-deploy build step + hash: 48ddafd120cc9cd4fb94c0d6f7530a14be46f28d + body: "" + footer: + Change-type: patch + change-type: patch + author: Akis Kesoglou + nested: [] + - subject: Lazily import Electron from child-writer process + hash: 851219f835ed037d9fd970f538095e4b339c5342 + body: > + No idea how this *used* to work, but it doesn’t since 887ec428 and this + is fixing it properly. + footer: + Change-type: patch + change-type: patch + author: Akis Kesoglou + nested: [] + version: 1.15.1 + title: "" + date: 2023-02-01T12:18:55.922Z +- commits: + - subject: Add support for Node 18 + hash: 887ec42847acbd4a935b4e9ed6abb2b8d87058ce + body: > + The Electron version we’re currently using is on Node 14 but this is a + step forward to upgrading to a newer Electron and Node version. + + + Updates etcher-sdk and switches the redundant aws4-axios dependency to + just axios. + + + Also changed bundler to stop trying to bundle wasm files — they must be + included inline with JS code as data — and removed some now redundant + code. + + + The crucial changes that enable support are: + + + 1. The update to etcher-sdk@8 where some dependency fixes and updates + took place + + 2. The downgrade and pinning of "electron-rebuild" to v3.2.3 until we’re + able to update to Electron >= 14.2. The patch we need to avoid is + https://github.com/electron/rebuild/pull/907. Also see: + https://github.com/nodejs/node-gyp/issues/2673 and + https://github.com/electron/rebuild/issues/913 + + 3. A rule in webpack.config to ignore `aws-crt` which is a dependency of + (ultimately) `aws4-axios` which is used by etcher-sdk and does a runtime + check to its availability. We’re not currently using the “assume role” + functionality (AFAIU) of aws4-axios and we don’t care that it’s not + found, so force webpack to ignore the import. See + https://github.com/aws/aws-sdk-js-v3/issues/3025 + footer: + Change-type: minor + change-type: minor + author: Akis Kesoglou + nested: [] + version: 1.15.0 + title: "" + date: 2023-01-27T11:36:32.980Z +- commits: + - subject: "patch: fixed mac sudo on other languages" + hash: 19d1e093fc2b1588492c9868f7604ee15ab3fd5b + body: "" + footer: {} + author: Peter Makra + nested: [] + version: 1.14.3 + title: "" + date: 2023-01-19T12:21:02.651Z +- commits: + - subject: "patch: revert to lockfile v1" + hash: 72af77860bee3685635c9f4db602c2a07e825037 + body: "" + footer: {} + author: Peter Makra + nested: [] + - subject: "patch: update etcher-sdk for cm4v5" + hash: 8e63be2efecada2ad6abd9d9d7728859e2c30ebc + body: "" + footer: + Change-type: patch + change-type: patch + author: builder555 + nested: [] + version: 1.14.2 + title: "" + date: 2023-01-17T14:37:41.555Z +- commits: + - subject: fix disabled-screensaver unhandled exception outside balena-electron env + hash: 46c406e8c1e3b5e41890aff7f65b1711e4426782 + body: "" + footer: + Change-type: patch + change-type: patch + author: Edwin Joassart + nested: [] + version: 1.14.1 + title: "" + date: 2023-01-16T13:22:36.972Z +- commits: + - subject: Anonymizes all paths before sending + hash: 86d43a536f7c9aa6b450a9f2f90341e07364208e + body: "" + footer: + Change-type: patch + change-type: patch + author: Otávio Jacobi + nested: [] + - subject: "patch: Sentry fix path" + hash: 6c417e35a13873cd95d25f42a819de3750cdf65d + body: "" + footer: {} + author: Edwin Joassart + nested: [] + - subject: Remove personal path on etcher + hash: 2b728d3c521b76177a2c019b4891627272f35aac + body: "" + footer: + Change-type: minor + change-type: minor + author: Otávio Jacobi + nested: [] + - subject: Unifying sentry reports in a single project + hash: f3f7ecb852503d4d97dbe6a78bf920ca177bddd1 + body: "" + footer: + Change-type: patch + change-type: patch + author: Edwin Joassart + nested: [] + - subject: Removes corvus in favor of sentry and analytics client + hash: 41fca03c98d4a72bd8c3842d7e6b9d41f65336f9 + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: Otavio Jacobi + signed-off-by: Otavio Jacobi + author: Otávio Jacobi + nested: [] + - subject: Removes corvus in favor of sentry and analytics client + hash: 10caf8f1b6a174762192b13ce7bb4eaa71e90fcc + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: Otavio Jacobi + signed-off-by: Otavio Jacobi + author: Otávio Jacobi + nested: [] + version: 1.14.0 + title: "" + date: 2023-01-16T11:23:54.866Z +- commits: + - subject: Adding EtcherPro device serial number to the Settings modal + hash: d25eda9a7d6bf89284b630b2d55cbb0a7e3a9432 + body: "" + footer: + Change-type: patch + change-type: patch + author: Aurelien VALADE + nested: [] + version: 1.13.4 + title: "" + date: 2023-01-12T15:10:50.328Z +- commits: + - subject: "patch: progress cm4 to second stage" + hash: 2475d576c7d9ecb46507c47c4143bdbfbdb44e45 + body: "" + footer: {} + author: Peter Makra + nested: [] + version: 1.13.3 + title: "" + date: 2023-01-11T14:30:45.116Z +- commits: + - subject: "patch: fixed winget parameter name" + hash: 33fe4b2c1abcb7f71f42a4b682f174422cb72a00 + body: "" + footer: {} + author: mcraa + nested: [] + version: 1.13.2 + title: "" + date: 2023-01-02T20:55:58.179Z +- commits: + - subject: "patch: updated sdk to fix bz2 issue" + hash: f79cb0fac56f6ec86f3a6f9be7035fbf59102253 + body: "" + footer: {} + author: Peter Makra + nested: [] + - subject: "patch: update copyright in electron-builder" + hash: ec42892c7cf1d22f4bb2968733ba9dc85e3552c6 + body: "" + footer: {} + author: JOASSART Edwin + nested: [] + version: 1.13.1 + title: "" + date: 2023-01-02T17:26:55.602Z +- commits: + - subject: "minor: electron version bump" + hash: e3072ac416470cd161309935c2622cc5a3d8d242 + body: "" + footer: {} + author: Peter Makra + nested: [] + - subject: "patch: handle ext2fs with webpack" + hash: b59b171e43a170c0ccf84d36ab4ba2db403e25c5 + body: "" + footer: {} + author: Peter Makra + nested: [] + - subject: "Patch: update etcher-sdk version to fix CM4 issues" + hash: 36c813714b3ce60e5e85f1889c9bc7eeadb524b4 + body: "" + footer: + Change-type: patch + change-type: patch + author: builder555 + nested: [] + version: 1.13.0 + title: "" + date: 2022-12-28T16:48:12.506Z +- commits: + - subject: Update dependency i18next to 21.10.0 + hash: b068b847c7ae6456ebd16a5d641ff61d8d074015 + body: | + Update i18next to 21.10.0 + + Update i18next from 21.8.14 to 21.10.0 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.12.7 + title: "" + date: 2022-12-20T19:35:11.219Z +- commits: + - subject: Update dependency react-i18next to 11.18.6 + hash: 2e85fb45de3a52e9bf0605e474a550e1af2bb980 + body: | + Update react-i18next to 11.18.6 + + Update react-i18next from 11.18.1 to 11.18.6 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.12.6 + title: "" + date: 2022-12-20T18:00:03.165Z +- commits: + - subject: "Patch: made trim setting more readable" + hash: 5c5a7612220b011e6942ac10b7026b7d6513e54f + body: "" + footer: + Change-type: patch + change-type: patch + author: builder555 + nested: [] + version: 1.12.5 + title: "" + date: 2022-12-20T12:27:33.706Z +- commits: + - subject: "patch: publish to winget with gh action" + hash: f9c8378d6a96e1c44d0bced0d3227a9930b9fd14 + body: "" + footer: {} + author: Begula + nested: [] + version: 1.12.4 + title: "" + date: 2022-12-19T19:41:59.151Z +- commits: + - subject: "Patch: replaced plain text with i18n in settings" + hash: 11cea7c926be1bac27df8ab583cbb4b8752a49c5 + body: "" + footer: + Change-type: patch + change-type: patch + author: builder555 + nested: [] + version: 1.12.3 + title: "" + date: 2022-12-19T09:51:52.545Z +- commits: + - subject: Update dependency webpack-dev-server to 4.11.1 + hash: c9e9d7d109ee103402acea1c7be4bac2f674168a + body: | + Update webpack-dev-server to 4.11.1 + + Update webpack-dev-server from 4.5.0 to 4.11.1 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.12.2 + title: "" + date: 2022-12-16T16:59:03.254Z +- commits: + - subject: "Patch: expose trim ext{2,3,4} setting" + hash: b9a82be29bee61a41f6f6a5ca6043dd8a7bee547 + body: "" + footer: + Change-type: patch + change-type: patch + author: builder555 + nested: [] + version: 1.12.1 + title: "" + date: 2022-12-16T15:02:34.104Z +- commits: + - subject: i18n support and Chinese translation + hash: 8fc574f0596f256382523c3b269e647a9aed5747 + body: "" + footer: + Change-type: minor + change-type: minor + author: ab77 + nested: [] + - subject: "minor: optimize i18n" + hash: 67d26ff7902c272e8113c9b650382a1dcb0cdde0 + body: > + Optimized several translations. + + This commit itself is only a patch, but as a pull request must have at + least one commit with a change-type. + footer: + Change-Type: minor + change-type: minor + author: r-q + nested: [] + version: 1.12.0 + title: "" + date: 2022-12-14T16:17:31.131Z +- commits: + - subject: Update dependency webpack-cli to 4.10.0 + hash: 757aa77d897d6266afbf6e7d62ddd0255ea0c926 + body: | + Update webpack-cli to 4.10.0 + + Update webpack-cli from 4.2.0 to 4.10.0 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.11.10 + title: "" + date: 2022-12-13T02:27:41.593Z +- commits: + - subject: Update dependency webpack to 5.75.0 + hash: cd67b442c9c55adddb2d8def456d7155af1f23c6 + body: | + Update webpack to 5.75.0 + + Update webpack from 5.11.0 to 5.75.0 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.11.9 + title: "" + date: 2022-12-12T23:58:09.807Z +- commits: + - subject: Update dependency awscli to 1.27.28 + hash: 927a026b869e0da872e17a662536d0ad3aeeae0f + body: | + Update awscli to 1.27.28 + + Update awscli from 1.27.27 to 1.27.28 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.11.8 + title: "" + date: 2022-12-12T21:55:28.620Z +- commits: + - subject: Update dependency uuid to 8.3.2 + hash: c9cfb87733a694a69044a3b04cb12e72047a92da + body: | + Update uuid to 8.3.2 + + Update uuid from 8.1.0 to 8.3.2 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.11.7 + title: "" + date: 2022-12-12T19:57:31.379Z +- commits: + - subject: Update dependency tslib to 2.4.1 + hash: f0747abe3fde8df4a004573a3ffd49134dd6d40d + body: | + Update tslib to 2.4.1 + + Update tslib from 2.0.0 to 2.4.1 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + - subject: "Patch: run linux build on ubuntu-20.04" + hash: adcd8e0325bc891460b3e51aa5403f8675189f13 + body: |- + as [`18.04` has been removed](https://github.blog/changelog/2022-08-09-github-actions-the-ubuntu-18-04-actions-runner-image-is-being-deprecated-and-will-be-removed-by-12-1-22/) + + We cannot use `latest` as the glibc version will cause issue with older ubuntu version. + footer: {} + author: Edwin Joassart + nested: [] + version: 1.11.6 + title: "" + date: 2022-12-12T17:59:43.391Z +- commits: + - subject: Update dependency ts-loader to 8.4.0 + hash: 5ae9a263619e9bb499705ee7c19df5707ea3936c + body: | + Update ts-loader to 8.4.0 + + Update ts-loader from 8.0.12 to 8.4.0 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.11.5 + title: "" + date: 2022-12-10T12:28:18.918Z +- commits: + - subject: Update dependency styled-components to 5.3.6 + hash: 88c5fa50352efe76a6506ee763915f504889111b + body: | + Update styled-components to 5.3.6 + + Update styled-components from 5.1.0 to 5.3.6 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.11.4 + title: "" + date: 2022-12-10T10:57:10.809Z +- commits: + - subject: Update dependency terser-webpack-plugin to 5.3.6 + hash: c431222909ef49126549c0f630cf1f3f3f8895ed + body: | + Update terser-webpack-plugin to 5.3.6 + + Update terser-webpack-plugin from 5.2.5 to 5.3.6 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.11.3 + title: "" + date: 2022-12-10T08:54:53.274Z +- commits: + - subject: Update dependency string-replace-loader to 3.1.0 + hash: 33f8851083d50ed2db2b1308d1f1cf8749751db5 + body: | + Update string-replace-loader to 3.1.0 + + Update string-replace-loader from 3.0.1 to 3.1.0 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.11.2 + title: "" + date: 2022-12-10T07:32:25.553Z +- commits: + - subject: Update dependency sinon to 9.2.4 + hash: 686a5837b69c26bc83772ed738376ce0a766fef5 + body: | + Update sinon to 9.2.4 + + Update sinon from 9.0.2 to 9.2.4 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.11.1 + title: "" + date: 2022-12-10T06:19:30.932Z +- commits: + - subject: Update dependency shyaml to 0.6.2 + hash: 2acad790d3e85b3215e692705691fff4fadb99b0 + body: | + Update shyaml to 0.6.2 + + Update shyaml from 0.5.0 to 0.6.2 + footer: + Change-type: minor + change-type: minor + author: Renovate Bot + nested: [] + version: 1.11.0 + title: "" + date: 2022-12-10T04:27:19.119Z +- commits: + - subject: Update dependency awscli to 1.27.27 + hash: 17858a7d72dc001419bf75ac04b1a66b782404e2 + body: | + Update awscli to 1.27.27 + + Update awscli from 1.27.26 to 1.27.27 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.10.29 + title: "" + date: 2022-12-10T03:05:02.826Z +- commits: + - subject: Update dependency rendition to 19.3.2 + hash: 0d740ad12dbadcb35d0e2076821a073177476acb + body: | + Update rendition to 19.3.2 + + Update rendition from 19.2.0 to 19.3.2 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: + - commits: + - subject: Add Breadcrumbs component export + hash: fbe0da641ae76ed99185f5799f94653bbed52609 + body: | + add breadcrumbs component export + footer: + Change-type: patch + change-type: patch + Signed-off-by: Andrea Rosci + signed-off-by: Andrea Rosci + author: JSReds + version: rendition-19.3.2 + date: 2020-12-29T17:27:09.528Z + - commits: + - subject: Fix max-width on breadcrumbs container + hash: b7c4ab7bed3caa1c10130f50abb582fcf63d867e + body: | + fix max-width on breadcrumbs container + footer: + Change-type: patch + change-type: patch + Signed-off-by: Andrea Rosci + signed-off-by: Andrea Rosci + author: JSReds + version: rendition-19.3.1 + date: 2020-12-29T13:35:01.615Z + - commits: + - subject: Add Breadcrumbs component + hash: 41a7abb3724a6c8a0a839d4083ce36ceaeeb9d91 + body: | + Add Breadcrumbs component and generate snapshots + footer: + Change-type: minor + change-type: minor + Signed-off-by: Andrea Rosci + signed-off-by: Andrea Rosci + author: JSReds + version: rendition-19.3.0 + date: 2020-12-29T12:12:16.944Z + version: 1.10.28 + title: "" + date: 2022-12-10T02:10:41.368Z +- commits: + - subject: Update dependency redux to 4.2.0 + hash: 85c183b9ef2dbe798c6d5cd8bce6367ef31e2624 + body: | + Update redux to 4.2.0 + + Update redux from 4.0.5 to 4.2.0 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.10.27 + title: "" + date: 2022-12-09T20:59:24.075Z +- commits: + - subject: Update dependency pretty-bytes to 5.6.0 + hash: d8b2a7a2369f24b1390bd85eca3cfbcd8282df80 + body: | + Update pretty-bytes to 5.6.0 + + Update pretty-bytes from 5.3.0 to 5.6.0 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.10.26 + title: "" + date: 2022-12-09T18:58:21.970Z +- commits: + - subject: Update dependency pnp-webpack-plugin to 1.7.0 + hash: 86bb093f3d7eec4835060789cc725e172223c74f + body: | + Update pnp-webpack-plugin to 1.7.0 + + Update pnp-webpack-plugin from 1.6.4 to 1.7.0 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.10.25 + title: "" + date: 2022-12-09T17:01:52.897Z +- commits: + - subject: Update dependency node-ipc to 9.2.1 + hash: f26b0748114c7623f152e00b065f3e6ec0657e83 + body: | + Update node-ipc to 9.2.1 + + Update node-ipc from 9.1.1 to 9.2.1 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.10.24 + title: "" + date: 2022-12-09T14:59:54.907Z +- commits: + - subject: Update dependency mocha to 8.4.0 + hash: be190c6c802f0cb6f5f68981b255aa4e620db2f7 + body: | + Update mocha to 8.4.0 + + Update mocha from 8.0.1 to 8.4.0 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.10.23 + title: "" + date: 2022-12-09T13:05:52.859Z +- commits: + - subject: Update dependency mini-css-extract-plugin to 1.6.2 + hash: d35f3c30498e3a8d8b8eb74a50952489f1c629fc + body: | + Update mini-css-extract-plugin to 1.6.2 + + Update mini-css-extract-plugin from 1.3.3 to 1.6.2 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.10.22 + title: "" + date: 2022-12-09T10:57:43.780Z +- commits: + - subject: Update dependency lint-staged to 10.5.4 + hash: 54e6c5e2c137073e6229fa28726d8f6b08853fcc + body: | + Update lint-staged to 10.5.4 + + Update lint-staged from 10.2.2 to 10.5.4 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.10.21 + title: "" + date: 2022-12-09T08:57:59.766Z +- commits: + - subject: Update dependency husky to 4.3.8 + hash: cf8b5790a1e9cf853328f128f9c52d72d5ac1da5 + body: | + Update husky to 4.3.8 + + Update husky from 4.2.5 to 4.3.8 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.10.20 + title: "" + date: 2022-12-09T06:59:31.264Z +- commits: + - subject: Update dependency esbuild-loader to 2.20.0 + hash: ba812b4f6484f0803486f7c1969992030267ae12 + body: | + Update esbuild-loader to 2.20.0 + + Update esbuild-loader from 2.16.0 to 2.20.0 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.10.19 + title: "" + date: 2022-12-09T04:58:48.480Z +- commits: + - subject: Update dependency electron-updater to 4.6.5 + hash: 32011c0deab646af1c4d99c15418f336f1dc02f1 + body: | + Update electron-updater to 4.6.5 + + Update electron-updater from 4.3.5 to 4.6.5 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.10.18 + title: "" + date: 2022-12-09T03:07:57.710Z +- commits: + - subject: Update dependency electron-notarize to 1.2.2 + hash: d68eab1dda78e17ce3804e6c7f08940b36f377a8 + body: | + Update electron-notarize to 1.2.2 + + Update electron-notarize from 1.0.0 to 1.2.2 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.10.17 + title: "" + date: 2022-12-09T01:21:25.322Z +- commits: + - subject: Update dependency awscli to 1.27.26 + hash: b5ab500a14396525cb6c7bac4eabf0b4b1c7cb11 + body: | + Update awscli to 1.27.26 + + Update awscli from 1.27.25 to 1.27.26 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.10.16 + title: "" + date: 2022-12-08T22:58:41.740Z +- commits: + - subject: Update dependency electron-builder to 22.14.13 + hash: 99862b95a55a3a7a174763d635073bab5dbc704f + body: | + Update electron-builder to 22.14.13 + + Update electron-builder from 22.10.5 to 22.14.13 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.10.15 + title: "" + date: 2022-12-08T21:37:01.110Z +- commits: + - subject: Update dependency debug to 4.3.4 + hash: b8af86e30c9ce3b8d9eba8749f2aeba1f6eea197 + body: | + Update debug to 4.3.4 + + Update debug from 4.2.0 to 4.3.4 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.10.14 + title: "" + date: 2022-12-08T19:55:06.173Z +- commits: + - subject: Update dependency awscli to 1.27.25 + hash: 0667d1110fbc05ef7222530ea413a1db7a2bd814 + body: | + Update awscli to 1.27.25 + + Update awscli from 1.27.24 to 1.27.25 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.10.13 + title: "" + date: 2022-12-08T17:57:06.474Z +- commits: + - subject: Update dependency css-loader to 5.2.7 + hash: 6991a4950bfb2b7c9ad93df4c76170003b7d47f0 + body: | + Update css-loader to 5.2.7 + + Update css-loader from 5.0.1 to 5.2.7 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.10.12 + title: "" + date: 2022-12-08T15:56:12.526Z +- commits: + - subject: Update dependency awscli to 1.27.24 + hash: 72b4d4f4fa5a013d9a808402660186a92b165bc7 + body: | + Update awscli to 1.27.24 + + Update awscli from 1.27.5 to 1.27.24 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.10.11 + title: "" + date: 2022-12-07T03:21:58.354Z +- commits: + - subject: Update dependency @types/node to 14.18.34 + hash: aa3756ad172e939dff88ad213fda2b57966341c6 + body: | + Update @types/node to 14.18.34 + + Update @types/node from 14.18.33 to 14.18.34 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.10.10 + title: "" + date: 2022-12-07T02:19:17.414Z +- commits: + - subject: Enable repository configuration + hash: 0d5bb4935f860a5b7f58810fce8084dc8f82dd65 + body: "" + footer: + Change-type: patch + change-type: patch + author: ab77 + nested: [] + version: 1.10.9 + title: "" + date: 2022-12-06T23:59:21.301Z +- commits: + - subject: Update dependency chai to 4.3.7 + hash: 4ed30027162365a68f26264f7574ac9eaf752926 + body: | + Update chai to 4.3.7 + + Update chai from 4.2.0 to 4.3.7 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.10.8 + title: "" + date: 2022-12-05T21:38:41.964Z +- commits: + - subject: Use core workflow for GitHub publish + hash: f3844d56e2bb317e9360f34f5054c91eb0fb8910 + body: "" + footer: + Change-type: patch + change-type: patch + author: ab77 + nested: [] + version: 1.10.7 + title: "" + date: 2022-12-05T19:39:07.247Z +- commits: + - subject: Dummy update to fix asset version issue + hash: 03d6a011db5fd4dad3d25fde86cf2b434c8192e8 + body: | + Due to a race between two patch, 1.10.5 assets are labelled 1.10.3. + This dummy PR should fix this. + footer: + Change-type: patch + change-type: patch + author: Edwin Joassart + nested: [] + version: 1.10.6 + title: "" + date: 2022-12-02T14:04:57.766Z +- commits: + - subject: "Patch: run linux build on ubuntu-18.04" + hash: 57a6ceff0e28d06063679a7a8b14671416ba46c5 + body: >- + Running on ubuntu-latest means you need a more recent version of glibc + which breaks on older ubuntu. + + + Thanks to @theofficialgman for suggesting the fix. + footer: {} + author: Edwin Joassart + nested: [] + version: 1.10.5 + title: "" + date: 2022-12-02T12:41:19.841Z +- commits: + - subject: "patch: remove Homebrew instructions in README" + hash: 0d1cfffa5c7c084d9f48d60c1abbf7e2974abb28 + body: | + Homebrew no longer supports etcher, so removing install instructions. + footer: + Change-type: patch + change-type: patch + author: Patrick Linnane + nested: [] + version: 1.10.4 + title: "" + date: 2022-12-01T23:27:55.910Z +- commits: + - subject: Allow external contributors + hash: 156b9314b5786e943256974d5344383ae1f0650d + body: "" + footer: + Change-type: patch + change-type: patch + author: ab77 + nested: [] + version: 1.10.3 + title: "" + date: 2022-12-01T22:31:25.592Z +- commits: + - subject: Fix missing analytics token + hash: 831339bd2cbe73dd441cdd77d85b34e98f68a6a6 + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: Edwin Joassart edwin.joassart@balena.io + signed-off-by: Edwin Joassart edwin.joassart@balena.io + author: Edwin Joassart + nested: [] + version: 1.10.2 + title: "" + date: 2022-11-25T19:22:49.679Z +- commits: + - subject: Fixing call to electron block screensaver methods invocation + hash: 1b5b64713505dfb69448bc2184839b4c23bd677b + body: > + Replacing `send` calls to `invoke` for `enable/disable-screensaver` + calls. + footer: + Change-type: patch + change-type: patch + Signed-off-by: Aurelien VALADE + signed-off-by: Aurelien VALADE + author: Aurelien VALADE + nested: [] + version: 1.10.1 + title: "" + date: 2022-11-21T16:50:14.797Z +- commits: + - subject: testing renovate + hash: 306e087ec6daed9e736a8918cde07159dd9298dc + body: "" + footer: + Change-Type: minor + change-type: minor + author: builder555 + nested: [] + version: 1.10.0 + title: "" + date: 2022-11-10T20:54:12.345Z +- commits: + - subject: Update dependency awscli to 1.27.5 + hash: 26dc2d19e56354b0f43c9af2f1d6dd51a4a0b235 + body: | + Update awscli to 1.27.5 + + Update awscli from 1.11.87 to 1.27.5 + footer: + Change-type: minor + change-type: minor + author: Renovate Bot + nested: [] + version: 1.9.0 + title: "" + date: 2022-11-08T21:37:25.500Z +- commits: + - subject: Update dependency @types/react-dom to 16.9.17 + hash: 448ce141d51ec342e95148f265daf0fc73df694c + body: | + Update @types/react-dom to 16.9.17 + + Update @types/react-dom from 16.8.4 to 16.9.17 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.8.17 + title: "" + date: 2022-11-08T20:38:27.629Z +- commits: + - subject: Update dependency @types/react to 16.14.34 + hash: 77b33b127dcfb0345e0ff80c80b2f560984c14b1 + body: | + Update @types/react to 16.14.34 + + Update @types/react from 16.8.5 to 16.14.34 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.8.16 + title: "" + date: 2022-11-08T19:39:42.616Z +- commits: + - subject: "CI: generalise artefact handling" + hash: e3618b939e119b8ae6d0dcea0f4077fe2c332122 + body: | + * on PR syncs, delete draft releases on Linux runners only + * delete draft releases when unmerged PRs are closed + footer: + Change-type: patch + change-type: patch + author: ab77 + nested: [] + version: 1.8.15 + title: "" + date: 2022-11-08T18:21:04.227Z +- commits: + - subject: Update dependency @types/node to 14.18.33 + hash: 7e2c2eae635e6d9aef1e65b158268400074ff020 + body: | + Update @types/node to 14.18.33 + + Update @types/node from 14.14.41 to 14.18.33 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.8.14 + title: "" + date: 2022-11-08T13:57:18.149Z +- commits: + - subject: Update dependency @types/copy-webpack-plugin to 6.4.3 + hash: 2c2a5c7c2b31d188cc32024dd6f9b5d0d1a5bc8b + body: | + Update @types/copy-webpack-plugin to 6.4.3 + + Update @types/copy-webpack-plugin from 6.0.0 to 6.4.3 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.8.13 + title: "" + date: 2022-11-08T12:39:27.293Z +- commits: + - subject: Update dependency @fortawesome/fontawesome-free to 5.15.4 + hash: 7bb52aa1706b4bfe06cdd023f4f95bf8de1a6666 + body: | + Update @fortawesome/fontawesome-free to 5.15.4 + + Update @fortawesome/fontawesome-free from 5.13.1 to 5.15.4 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.8.12 + title: "" + date: 2022-11-08T11:33:01.286Z +- commits: + - subject: Update dependency @balena/lint to 5.4.2 + hash: cc0285a77db78a014b73169cc8a6b2429961f41f + body: | + Update @balena/lint to 5.4.2 + + Update @balena/lint from 5.3.0 to 5.4.2 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.8.11 + title: "" + date: 2022-11-08T10:38:47.026Z +- commits: + - subject: Update dependency sys-class-rgb-led to 3.0.1 + hash: 0e58edf1139b16b26335f7b6f7b2e6f92c8c8838 + body: | + Update sys-class-rgb-led to 3.0.1 + + Update sys-class-rgb-led from 3.0.0 to 3.0.1 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: + - commits: + - subject: "patch: Delete Codeowners" + hash: 91e33b39ac7c55b1186887b20703e3298f37751c + body: "" + footer: {} + author: Vipul Gupta + version: sys-class-rgb-led-3.0.1 + date: 2021-07-01T10:53:00.610Z + version: 1.8.10 + title: "" + date: 2022-11-08T09:35:02.677Z +- commits: + - subject: Update dependency semver to 7.3.8 + hash: 8357cc19d258103bc66061467ac984b1adae6456 + body: | + Update semver to 7.3.8 + + Update semver from 7.3.2 to 7.3.8 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.8.9 + title: "" + date: 2022-11-08T08:40:21.355Z +- commits: + - subject: Update dependency omit-deep-lodash to 1.1.7 + hash: a4f944e7959431f24b55c44dbcde2b13530cf902 + body: | + Update omit-deep-lodash to 1.1.7 + + Update omit-deep-lodash from 1.1.4 to 1.1.7 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.8.8 + title: "" + date: 2022-11-08T07:33:36.421Z +- commits: + - subject: Update dependency immutable to 3.8.2 + hash: 330df325f9b2eb855c6213f91cdb0d4cf1439525 + body: | + Update immutable to 3.8.2 + + Update immutable from 3.8.1 to 3.8.2 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.8.7 + title: "" + date: 2022-11-08T06:19:12.271Z +- commits: + - subject: Update dependency electron-rebuild to 3.2.9 + hash: 3dc54405feebce319bb29933f9bad52621067f0a + body: | + Update electron-rebuild to 3.2.9 + + Update electron-rebuild from 3.2.5 to 3.2.9 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.8.6 + title: "" + date: 2022-11-08T05:18:29.447Z +- commits: + - subject: Update dependency electron-mocha to 9.3.3 + hash: 1b93891ed805d2a091a3d4eaff6a00a498de6eaa + body: | + Update electron-mocha to 9.3.3 + + Update electron-mocha from 9.3.2 to 9.3.3 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.8.5 + title: "" + date: 2022-11-08T04:22:23.418Z +- commits: + - subject: Update dependency @types/webpack-node-externals to 2.5.3 + hash: ea5a167f4f3eb81a177ebd5c9c3def2e38a65f37 + body: | + Update @types/webpack-node-externals to 2.5.3 + + Update @types/webpack-node-externals from 2.5.0 to 2.5.3 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.8.4 + title: "" + date: 2022-11-08T02:41:36.635Z +- commits: + - subject: Update dependency @types/tmp to 0.2.3 + hash: 98a5ddf58ad762d46d532310100513834c6d68b5 + body: | + Update @types/tmp to 0.2.3 + + Update @types/tmp from 0.2.0 to 0.2.3 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.8.3 + title: "" + date: 2022-11-08T01:36:34.632Z +- commits: + - subject: Generate release notes with git + hash: a61aa8e2bec57281655eb1c89c956fd5d42d3fc5 + body: "" + footer: + Change-type: patch + change-type: patch + author: ab77 + nested: [] + version: 1.8.2 + title: "" + date: 2022-11-08T00:19:25.825Z +- commits: + - subject: Update dependency @types/mime-types to 2.1.1 + hash: fe09f9f862d2eef79a237986c50e587b232d9c2d + body: | + Update @types/mime-types to 2.1.1 + + Update @types/mime-types from 2.1.0 to 2.1.1 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.8.1 + title: "" + date: 2022-11-07T23:35:26.671Z +- commits: + - subject: Update scripts/resin digest to 652fdd4 + hash: 16422971012d77dc928c9d99c3db6b1a58cd52be + body: | + Update scripts/resin to + + Update scripts/resin from to + footer: + Change-type: minor + change-type: minor + author: Renovate Bot + nested: [] + version: 1.8.0 + title: "" + date: 2022-11-07T22:27:03.928Z +- commits: + - subject: Build targets individually + hash: b58249b9c833763ec80402820b2c93c01fafda22 + body: "" + footer: + Change-type: patch + change-type: patch + author: ab77 + nested: [] + version: 1.7.15 + title: "" + date: 2022-11-07T21:36:35.993Z +- commits: + - subject: Update dependency lodash to 4.17.21 [SECURITY] + hash: f356e4c303080eefdf74f52c2b4de227d20e4e49 + body: | + Update lodash to 4.17.21 + + Update lodash from 4.17.10 to 4.17.21 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 1.7.14 + title: "" + date: 2022-11-07T20:17:53.572Z +- commits: + - subject: Update release notes on finalize + hash: 576113febfe000339545c0fd55793aafd2e53abb + body: "" + footer: + Change-type: patch + change-type: patch + author: ab77 + nested: [] + version: 1.7.13 + title: "" + date: 2022-11-07T19:17:06.571Z +- commits: + - subject: Avoid duplicate releases + hash: 33dea6267fbcc3cd47b1744830731c853ebbba18 + body: "" + footer: + Change-type: patch + change-type: patch + author: ab77 + nested: [] + version: 1.7.12 + title: "" + date: 2022-11-07T18:32:19.617Z +- commits: + - subject: Only run finalize on Linux runners + hash: 9ab307df4f4f617adac33c6a36f492229050bb0e + body: "" + footer: + Change-type: patch + change-type: patch + author: ab77 + nested: [] + version: 1.7.11 + title: "" + date: 2022-11-07T17:32:25.787Z +- commits: + - subject: Switch to Flowzone + hash: 2e53feb38cd548bd2fe68957797bffe66b832eaf + body: "" + footer: + Change-type: patch + change-type: patch + author: ab77 + nested: [] + version: 1.7.10 + title: "" + date: 2022-11-07T15:59:41.308Z +- commits: + - subject: "patch: update allowed extensions to include deb afterinstall in build" + hash: 61610ded842caba47c6a682afcb08aa0fda4e86b + body: "" + footer: {} + author: mcraa + nested: [] + - subject: "patch: add update notification" + hash: c87a132f40b41c28d2375c7489d66ad4a6914355 + body: "" + footer: {} + author: Peter Makra + nested: [] + - subject: "patch: fix usb-device-boot link in README" + hash: 350d4de32ba0739b0ad1c2dc0b0b98eecf41f8f9 + body: "" + footer: + Change-type: patch + change-type: patch + author: Andrew Scheller + nested: [] + - subject: Fix application directory for Debian postinst script + hash: f5f9025d6db248a8774ff6c9bb9d2afebda6cc3b + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: Ken Bannister + signed-off-by: Ken Bannister + author: Ken Bannister + nested: [] + version: 1.7.9 + title: "'patch: deb afterinstall and readme updates'" + date: 2022-04-22T13:10:47.137Z +- commits: + - subject: "patch: complete suse uninstall readme" + hash: 8370f638b4e92a4c981f79362ba0d0700f9f94a1 + body: "" + footer: + Change-Type: patch + change-type: patch + author: Peter Makra + nested: [] + - subject: "patch: completed suse instructions" + hash: ac34c511251f195fd37baf24d1c150a309210c9e + body: "" + footer: + Change-Type: patch + change-type: patch + author: Peter Makra + nested: [] + - subject: "patch: order rpm instrictions" + hash: b241470fe1bae57e70888b84bb066855363a350b + body: "" + footer: + Change-Type: patch + change-type: patch + author: Peter Makra + nested: [] + - subject: "patch: enabled update notification for version 1.7.8" + hash: 335766ed12901d6b8b16860d449eca4ea574f9c1 + body: "" + footer: + Change-Type: patch + change-type: patch + author: Peter Makra + nested: [] + - subject: "patch: updated title to balenaEtcher" + hash: 4c5d052a7185ecd598a12d80d2bd7afd5ced7c92 + body: | + fixes #3592 + footer: + Change-Type: patch + change-type: patch + author: Peter Makra + nested: [] + - subject: "patch: cleanup and organize readme" + hash: 86423342a86a9327545099eb9df47236d0ac6aef + body: "" + footer: + Change-Type: patch + change-type: patch + author: Peter Makra + nested: [] + - subject: "patch: extend cloudsmith attribution in readme" + hash: d8b41552e34faf71bbd128f3857667f8f341a217 + body: "" + footer: + Change-Type: patch + change-type: patch + author: Peter Makra + nested: [] + - subject: Update macOS Icon to Big Sur Style + hash: 11c65fb392416027158918f77bde68dd8996187c + body: "" + footer: + Change-type: patch + change-type: patch + author: Logicer + nested: [] + version: 1.7.8 + title: "'small ui updates'" + date: 2022-03-18T10:39:52.131Z +- commits: + - subject: "patch: clarified update check" + hash: a5201942b8817cc1d74fba0ae2c8378632d16fc5 + body: "" + footer: {} + author: Peter Makra + nested: [] + - subject: "patch: autoupdate stagingPercentage check, include default" + hash: c1f7164273ffff5d2d5e6aadc1defcd9b0acbecb + body: "" + footer: + Change-Type: patch + change-type: patch + author: Peter Makra + nested: [] + version: 1.7.7 + title: "'patch: Fix auto update'" + date: 2022-02-22T08:57:27.982Z +- commits: + - subject: "patch: version number notification" + hash: 35868509af3461f5bc312990d184d88eae476c4f + body: "" + footer: {} + author: Peter Makra + nested: [] + - subject: "patch: fixed typos in template" + hash: 4366bb372f3c273ccce99dc61b1ced905c591004 + body: "" + footer: {} + author: Peter Makra + nested: [] + - subject: "patch: add requirements and help to issue template" + hash: e4d02bc561c359ace94a2c461310ef0dc44b2ca1 + body: "" + footer: {} + author: mcraa + nested: [] + - subject: "patch: add requirements and help to issue template" + hash: b9e54e39f7f95aa64e2b12474936c3ce880b661f + body: "" + footer: {} + author: mcraa + nested: [] + version: 1.7.6 + title: "'patch: add requirements and help to issue template'" + date: 2022-02-21T15:40:15.306Z +- commits: + - subject: "patch: fix flashing from URL when using basic auth" + hash: a6f6cd4a19b25c26cbc36386719186a7e3c31fea + body: "" + footer: {} + author: Marco Füllemann + nested: [] + version: 1.7.5 + title: "'patch: fix flashing from URL when using basic auth'" + date: 2022-02-21T12:39:38.276Z +- commits: + - subject: "patch: set version update notification 1.7.3" + hash: 28adc34239f9abc7ccfe13f2810991ca0f17a645 + body: "" + footer: {} + author: Peter Makra + nested: [] + - subject: "patch: updated electron to 12.2.3" + hash: 59f54e194bd19c5e77b797039141be65371b376c + body: "" + footer: + Change-Type: patch + change-type: patch + author: Peter Makra + nested: [] + - subject: "patch: updated electron to 12.2.3" + hash: c4834e61a7058d91d9a17960acb16365591a17fd + body: "" + footer: + Change-Type: patch + change-type: patch + author: Peter Makra + nested: [] + version: 1.7.4 + title: "'patch: updated electron to 12.2.3'" + date: 2022-02-21T08:33:45.382Z +- commits: + - subject: "patch: fix mesage of null" + hash: 9c1b55bebc1f7777ee830886c1999a72f082c17f + body: "" + footer: + Change-Type: patch + change-type: patch + author: Peter Makra + nested: [] + version: 1.7.3 + date: 2021-12-29T14:31:13.283Z +- commits: + - subject: "patch: fixed open from browser on windows" + hash: ef90d048ca2fc9e3eb7731b4b5eff63c3f0ee00a + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: Peter Makra + signed-off-by: Peter Makra + author: Peter Makra + nested: [] + version: 1.7.2 + date: 2021-12-21T16:51:12.194Z +- commits: + - subject: "patch: Revert back to electron-rebuild" + hash: ea9875ddf06b932b22b5b26d64fed6fe4f02384e + body: "" + footer: + Signed-off-by: Lorenzo Alberto Maria Ambrosi + signed-off-by: Lorenzo Alberto Maria Ambrosi + author: Lorenzo Alberto Maria Ambrosi + nested: [] + - subject: "patch: Disallow TS in JS" + hash: 65dacd2ff282864b82283b7f8251ef9fa548ed3f + body: "" + footer: + Signed-off-by: Lorenzo Alberto Maria Ambrosi + signed-off-by: Lorenzo Alberto Maria Ambrosi + author: Lorenzo Alberto Maria Ambrosi + nested: [] + - subject: "patch: Remove esInterop TS flag" + hash: a190818827e2354f9ff13d04017541c1fae6cd47 + body: "" + footer: + Signed-off-by: Lorenzo Alberto Maria Ambrosi + signed-off-by: Lorenzo Alberto Maria Ambrosi + author: Lorenzo Alberto Maria Ambrosi + nested: [] + - subject: "patch: Use @balena/sudo-prompt" + hash: 98e33b619be70348429038b5d04e49a840c8f218 + body: "" + footer: + Signed-off-by: Lorenzo Alberto Maria Ambrosi + signed-off-by: Lorenzo Alberto Maria Ambrosi + author: Lorenzo Alberto Maria Ambrosi + nested: [] + - subject: "patch: Update rpiboot guide link" + hash: 685ed715ac85495343a82e5d7886ad826fe2cdfe + body: "" + footer: + Signed-off-by: Lorenzo Alberto Maria Ambrosi + signed-off-by: Lorenzo Alberto Maria Ambrosi + author: Lorenzo Alberto Maria Ambrosi + nested: [] + - subject: "patch: Improve webpack build time" + hash: 3cf3c4b398fb65cb4ca59cbf8c3798492197f622 + body: "" + footer: + Signed-off-by: Lorenzo Alberto Maria Ambrosi + signed-off-by: Lorenzo Alberto Maria Ambrosi + author: Lorenzo Alberto Maria Ambrosi + nested: [] + version: 1.7.1 + date: 2021-11-22T11:27:50.714Z +- commits: + - subject: "patch: Add missing @types/react@16.8.5" + hash: 0a28af5c35a5c73cd78a729bfd8f4bb7978d7c1a + body: "" + footer: + Signed-off-by: Lorenzo Alberto Maria Ambrosi + signed-off-by: Lorenzo Alberto Maria Ambrosi + author: Lorenzo Alberto Maria Ambrosi + nested: [] + - subject: "patch: Use npm ci in Makefile" + hash: 0c1e5b88ef01465ee84712560971af31c3f630ca + body: "" + footer: + Signed-off-by: Lorenzo Alberto Maria Ambrosi + signed-off-by: Lorenzo Alberto Maria Ambrosi + author: Lorenzo Alberto Maria Ambrosi + nested: [] + - subject: "patch: Add draft info boxes for system information" + hash: 790201be90e63a3e93c64060bacd977e52dfb4ff + body: "" + footer: + Signed-off-by: Lorenzo Alberto Maria Ambrosi + signed-off-by: Lorenzo Alberto Maria Ambrosi + author: Lorenzo Alberto Maria Ambrosi + nested: [] + - subject: "patch: Remove electron-rebuild package" + hash: d8d379f05e8adc4fb3df6b5f926d3ff548bed0bc + body: "" + footer: + Signed-off-by: Lorenzo Alberto Maria Ambrosi + signed-off-by: Lorenzo Alberto Maria Ambrosi + author: Lorenzo Alberto Maria Ambrosi + nested: [] + - subject: "patch: Make electron a dev. dependency" + hash: b5e9701048eebd4f8a56157cad8bdc966e354a32 + body: "" + footer: + Signed-off-by: Lorenzo Alberto Maria Ambrosi + signed-off-by: Lorenzo Alberto Maria Ambrosi + author: Lorenzo Alberto Maria Ambrosi + nested: [] + - subject: "patch: Remove electron-rebuild package" + hash: 292f86d6f5b0e8dd34cb3dd6e008517f9a066cd0 + body: "" + footer: + Signed-off-by: Lorenzo Alberto Maria Ambrosi + signed-off-by: Lorenzo Alberto Maria Ambrosi + author: Lorenzo Alberto Maria Ambrosi + nested: [] + - subject: "patch: Use exact modules versions" + hash: 76ca9934c808ec013dcad2b427b21f253c588d8d + body: "" + footer: + Signed-off-by: Lorenzo Alberto Maria Ambrosi + signed-off-by: Lorenzo Alberto Maria Ambrosi + author: Lorenzo Alberto Maria Ambrosi + nested: [] + - subject: "patch: Update etcher-sdk from v6.2.5 to v6.3.0" + hash: 37b826ee4ee47bda5285083c2184b7e6bf2a6a3b + body: "" + footer: + Signed-off-by: Lorenzo Alberto Maria Ambrosi + signed-off-by: Lorenzo Alberto Maria Ambrosi + author: Lorenzo Alberto Maria Ambrosi + nested: [] + - subject: Fix write step for Http file process + hash: 1e1bd3c508197f0e129715d5e37d1bc06744089b + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: Andrea Rosci + signed-off-by: Andrea Rosci + author: JSReds + nested: [] + - subject: "patch: Fix linting errors" + hash: 00e8f11913eb9eaadb09909cc530693aac825e9f + body: "" + footer: + Signed-off-by: Lorenzo Alberto Maria Ambrosi + signed-off-by: Lorenzo Alberto Maria Ambrosi + author: Lorenzo Alberto Maria Ambrosi + nested: [] + - subject: "minor: Refactor dependencies installation to avoid custom scripts" + hash: a3c24a26a05d1c3a767bf7f515cc7f193c9d8e2b + body: "" + footer: + Signed-off-by: Lorenzo Alberto Maria Ambrosi + signed-off-by: Lorenzo Alberto Maria Ambrosi + author: Lorenzo Alberto Maria Ambrosi + nested: [] + - subject: "patch: Fix LEDs init error" + hash: 4232928ad894fed548290054b09e25e60fa9eda3 + body: "" + footer: + Signed-off-by: Lorenzo Alberto Maria Ambrosi + signed-off-by: Lorenzo Alberto Maria Ambrosi + author: Lorenzo Alberto Maria Ambrosi + nested: [] + version: 1.7.0 + date: 2021-11-09T13:13:32.580Z +- commits: + - subject: Add support for basic auth when downloading images from URL. + hash: b2d0c1c9ddbbfe87d5a905d420d615821610e825 + body: > + When selecting "Flash from URL" the user can optionally provide a + username and password for basic authentication. The authentication input + fields are collapsed by default. When the authentication input fields + are collapsed after entering values the values are cleared to ensure + that the user sees all parameter passed to the server. + footer: + Change-Type: minor + change-type: minor + Changelog-Entry: Add support for basic auth when downloading images from URL. + changelog-entry: Add support for basic auth when downloading images from URL. + author: Marco Füllemann + nested: [] + - subject: "patch: Update etcher-sdk from v6.2.1 to v6.2.5" + hash: 14d91400a425617ee87e0d64f55980bd378fbfc2 + body: "" + footer: + Signed-off-by: Lorenzo Alberto Maria Ambrosi + signed-off-by: Lorenzo Alberto Maria Ambrosi + author: Lorenzo Alberto Maria Ambrosi + nested: [] + - subject: Update Makefile to Apple M1 info + hash: d0114aece7df213e27a84cb0081ba6cedd541bcb + body: | + Expanding host architecture detection. + footer: + Change-type: patch + change-type: patch + author: David Gaspar + nested: [] + - subject: Add LED settings for potentially different hardware + hash: dff2df4aab73a26fb90401869bfd58035dc652a9 + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: Lorenzo Alberto Maria Ambrosi + signed-off-by: Lorenzo Alberto Maria Ambrosi + author: Lorenzo Alberto Maria Ambrosi + nested: [] + version: 1.6.0 + date: 2021-09-20T10:42:04.677Z +- commits: + - subject: Restore image file selection LED-drive pathing + hash: f46963b6b3176395acc07863c9936a7c7f31d31a + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: Lorenzo Alberto Maria Ambrosi + signed-off-by: Lorenzo Alberto Maria Ambrosi + author: Lorenzo Alberto Maria Ambrosi + nested: [] + - subject: Update scripts submodule + hash: b97f4e0031d7c4d0f33be9fdb8c999631f9eef1d + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: Lorenzo Alberto Maria Ambrosi + signed-off-by: Lorenzo Alberto Maria Ambrosi + author: Lorenzo Alberto Maria Ambrosi + nested: [] + - subject: Change LEDs colours + hash: e2d233d74b6335fd53a9271a9c00c3f93828c5b5 + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: Lorenzo Alberto Maria Ambrosi + signed-off-by: Lorenzo Alberto Maria Ambrosi + author: Lorenzo Alberto Maria Ambrosi + nested: [] + - subject: Windows images now show the proper warning again + hash: a7ca2e527bc0cc040711ee4d60f93eda35f17558 + body: "" + footer: + Change-type: patch + change-type: patch + Changelog-entry: Windows images now show the proper warning again + changelog-entry: Windows images now show the proper warning again + Signed-off-by: Lorenzo Alberto Maria Ambrosi + signed-off-by: Lorenzo Alberto Maria Ambrosi + author: Lorenzo Alberto Maria Ambrosi + nested: [] + - subject: Fix Update and install with DNF instructions + hash: 396a053c0a0ec8def4b3672509cbb4ecc0b0c784 + body: "" + footer: + Change-type: patch + change-type: patch + author: Mohamed Salah + nested: [] + - subject: Add possibile authorization as a query param + hash: d1a3f1cb88ff38f804caa9289d3205b09666c1e6 + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: Andrea Rosci + signed-off-by: Andrea Rosci + author: JSReds + nested: [] + - subject: update the windows part + hash: 9f96558cdd11ce83dcc08289c31da425063eab24 + body: | + I choose to add this part because, after the clean the usb stick + could stay in a raw state without creating the new partions, + activating and formatting. + Thanks + footer: + Change-type: patch + change-type: patch + author: Xtraim + nested: [] + - subject: Update SUPPORT.md + hash: b3bc589d70cc4498a13f86f7d9aa36d9908275e3 + body: "" + footer: + Change-type: patch + change-type: patch + author: thambu1710 + nested: [] + - subject: replace make webpack with npm run webpack + hash: 18d2c28110c8b4b4c327a58f6f6a712c33dfd4cc + body: "" + footer: + Change-type: patch + change-type: patch + author: Seth Falco + nested: [] + - subject: Add loader on image select + hash: b272ef296dec9b4242028202e1d759f1e2d1aa2b + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: Andrea Rosci + signed-off-by: Andrea Rosci + author: JSReds + nested: [] + - subject: add pnp-webpack-plugin + hash: 32ca28a3a95d2ffd3eb2b32cfc54113515ae3097 + body: "" + footer: + Change-type: patch + change-type: patch + author: Zane Hitchcox + nested: [] + - subject: Remove redundant codespell dependency/tests + hash: 4d5e5a3b0b81cbdd3341abbcca0c816bc905a8ed + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: Lorenzo Alberto Maria Ambrosi + signed-off-by: Lorenzo Alberto Maria Ambrosi + author: Lorenzo Alberto Maria Ambrosi + nested: [] + version: 1.5.122 + date: 2021-09-02T12:20:22.871Z +- commits: + - subject: "patch: Delete Codeowners" + hash: a81b552b95f93a8989a6fff4774a14e21abe9a0e + body: "" + footer: {} + author: Vipul Gupta + nested: [] + - subject: Add source maps for devtools + hash: 53f53c0f75779e814834e2fd0375b705664190c5 + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: Lorenzo Alberto Maria Ambrosi + signed-off-by: Lorenzo Alberto Maria Ambrosi + author: Lorenzo Alberto Maria Ambrosi + nested: [] + - subject: Clone submodules when initializing modules + hash: fdaf5c69d6bd20b64b1c1749b62dec9c22f12fb4 + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: Lorenzo Alberto Maria Ambrosi + signed-off-by: Lorenzo Alberto Maria Ambrosi + author: Lorenzo Alberto Maria Ambrosi + nested: [] + - subject: "patch: Select drive on list interaction rather than modal closing" + hash: 061afca5d3ce7dbf67d66706e6c2c65ecd61cf7b + body: "" + footer: + Signed-off-by: Lorenzo Alberto Maria Ambrosi + signed-off-by: Lorenzo Alberto Maria Ambrosi + author: Lorenzo Alberto Maria Ambrosi + nested: [] + version: 1.5.121 + date: 2021-07-05T18:20:04.735Z +- commits: + - subject: Update README to reference Cloudsmith + hash: 7e333caaf9d94ff90583fe897ccabb6fdf860f74 + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: Lorenzo Alberto Maria Ambrosi + signed-off-by: Lorenzo Alberto Maria Ambrosi + author: Lorenzo Alberto Maria Ambrosi + nested: [] + version: 1.5.120 + date: 2021-05-11T16:04:28.710Z +- commits: + - subject: Update readme for new PPA provider + hash: 250aed2eb1911a6302a80bd7e9f4488c96787ee0 + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: Lorenzo Alberto Maria Ambrosi + signed-off-by: Lorenzo Alberto Maria Ambrosi + author: Lorenzo Alberto Maria Ambrosi + nested: [] + version: 1.5.119 + date: 2021-04-30T21:33:09.009Z +- commits: + - subject: "patch: development environment" + hash: 1ee110bc9587ecdc672b5b9cf8373e78c04943a1 + body: >- + Add webpack dev server and hot module reloading to get live changes and + reloads without reloading the whole electron app. + + + This patch also runs the development environment in development mode, + which is much, much faster on builds and rebuilds. + footer: {} + author: Zane Hitchcox + nested: [] + - subject: "patch: watch files for electron" + hash: 33dd07c6751e5ca84b5e7d78027e2e9fec1e7b0e + body: "" + footer: {} + author: Zane Hitchcox + nested: [] + version: 1.5.118 + date: 2021-04-27T01:21:31.707Z +- commits: + - subject: Rename mac releases (keep old naming) + hash: 0bdea5c54ca1465d89c73cd269e60ebb24c79f0f + body: "" + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + nested: [] + - subject: Disable spectron tests on macOS + hash: 3be372d49fd0a24bd67086d4a523ed831a828d4b + body: "" + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + nested: [] + - subject: Update electron to v12.0.2 + hash: d0c66b2c4844540c90440f2baea9819dc136a16b + body: "" + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + nested: [] + - subject: Update etcher-sdk from 6.1.1 to 6.2.1 + hash: 65082c4790c1109077aecae1a5f48def4db03e0c + body: | + Update etcher-sdk from 6.1.1 to 6.2.1 + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + nested: + - commits: + - subject: Update node-raspberrypi-usbboot from 0.2.11 to 0.3.0 + hash: de39ec278ff397d1f69bcb4db968486ce59b33b2 + body: | + Update node-raspberrypi-usbboot from 0.2.11 to 0.3.0 + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + nested: + - commits: + - subject: Add support for compute module 4 + hash: 701744f0bbc02bd7d322ed7e989af576a7156689 + body: "" + footer: + Change-type: minor + change-type: minor + author: Alexis Svinartchouk + - subject: Fix size endianness of boot_message_t message + hash: 867d8b0d217af0ad554d839fbc42cc08b222bc32 + body: "" + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + version: node-raspberrypi-usbboot-0.3.0 + date: 2021-03-26T16:10:38.120Z + version: etcher-sdk-6.2.1 + date: 2021-03-26T16:37:33.170Z + - commits: + - subject: Added BeagleBone USB Boot example + hash: f088dbb3543d55341d06cfb6b20f64e02b9f6a78 + body: "" + footer: + Change-type: patch + change-type: patch + author: Parthiban Gandhi + nested: [] + - subject: Added BeagleBone USB Boot support + hash: 2a1d745bf59ca93739f489d7ae85ba19bc2697da + body: "" + footer: + Change-type: minor + change-type: minor + author: Parthiban Gandhi + nested: [] + version: etcher-sdk-6.2.0 + date: 2021-02-18T12:08:54.323Z + - subject: Fix getAppPath() returning an asar file on macOS + hash: e87ed9beed924da86b73c10addde432958586895 + body: "" + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + nested: [] + - subject: Grammar fix + hash: bc5563d9c2ac9dcdd541d7e3cf062b9c29f8e1b4 + body: | + "flash directly" sounds odd + footer: + Change-type: patch + change-type: patch + author: Andrew Scheller + nested: [] + - subject: (docs) update README.md + hash: ad83ab5dccba5c4d746d52fc7ea6e18451bfd162 + body: | + - fix spelling + - emphasize notes + - add link + - fix macOS to account for new homebrew API + footer: + Change-type: patch + change-type: patch + author: vlad doster + nested: [] + - subject: Update copyright year in electron-builder.yml + hash: 0dc1cf970186ef235eb12e5839712e7389ee37ef + body: "" + footer: + Change-type: patch + change-type: patch + author: Andrew Scheller + nested: [] + - subject: Update copyright year in .resinci.json + hash: 11489c653861590da2129f00fa938b062d9fd16a + body: "" + footer: + Change-type: patch + change-type: patch + author: Andrew Scheller + nested: [] + - subject: Separate the Yum and DNF instructions. + hash: 2619d4bc8602962d45317713474968c4aa833d67 + body: "" + footer: + Change-type: patch + change-type: patch + author: Dugan Chen + nested: [] + - subject: Set msvs_version to 2019 when rebuilding + hash: 3730efd350d0875b7bbfcd58b614ca2ab025de4f + body: "" + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + nested: [] + - subject: "Use moduleIds: 'natural' in webpack config to keep js files in arm64 + and x64 mac builds identical" + hash: 6ece32c546ca83a5be387d2618ce2967ad65dc81 + body: "" + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + nested: [] + - subject: Update electron-builder to 22.10.5 + hash: fd9996a3cc8f9c973518f57f439b3bc78b7b1671 + body: "" + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + nested: [] + - subject: Update spectron to v13 + hash: f06cc89152772bcf8748a02514a948bc9aecc9a1 + body: "" + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + nested: [] + - subject: Update dependencies, use aws4-axios@2.2.1 to avoid adding more + dependiencies + hash: c1d7ab3fa9e66b5c33a302c62c282d48e37dde54 + body: | + Also filter out dmg-license dependencies from the shrinkwrap file + aws4-axios@2.3.0 brings in react-native, see aws/aws-sdk-js-v3#1797 + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + nested: [] + - subject: Update scripts to build universal mac dmgs on the ci + hash: b206483c7cf37ef9865bc242b4053f6a5cc7cdec + body: "" + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + nested: [] + - subject: Fix beforeBuild.js script to also work on mac + hash: c3eb8c7b5603129ab12e38dda6f34bfb752034ef + body: "" + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + nested: [] + - subject: Support building universal dmgs (x64 and arm64) for mac + hash: 0849d4f435ba0e5612b6837996b18ab148346f07 + body: "" + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + nested: [] + - subject: Update electron-builder to 22.10.4 + hash: 1dba3ae19b324b5a45541002e91c0e5fd93c92e3 + body: "" + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + nested: [] + - subject: Fix titlebar z-index + hash: f33f2e3771f0ea08424bb8169d596198a1c09035 + body: "" + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + nested: [] + - subject: Explicitly set contextIsolation to false + hash: e56aaed9735cc22b28317455a4dc81d86d7746ab + body: "" + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + nested: [] + - subject: Update electron from 9.4.1 to 11.2.3 + hash: a4659f038eb8ed0aa6ffb7b2e2c22ff5d29250d3 + body: "" + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + nested: [] + - subject: Update etcher-sdk from 6.1.0 to 6.1.1 + hash: cd462818da6f812fcec547e933964697bfd6847e + body: | + Update etcher-sdk from 6.1.0 to 6.1.1 + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + nested: + - commits: + - subject: Update node-raspberrypi-usbboot from 0.2.10 to 0.2.11 + hash: 66a232f0a2cb06192a5d94ddde9831893966cc94 + body: | + Update node-raspberrypi-usbboot from 0.2.10 to 0.2.11 + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + nested: + - commits: + - subject: Update @balena.io/usb from 1.3.12 to 1.3.14 + hash: d7cb5c673bfc8bd7c4ca3d49490fc9407d12700d + body: | + Update @balena.io/usb from 1.3.12 to 1.3.14 + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + version: node-raspberrypi-usbboot-0.2.11 + date: 2021-02-10T15:43:10.247Z + version: etcher-sdk-6.1.1 + date: 2021-02-10T16:33:01.204Z + version: 1.5.117 + date: 2021-04-02T14:05:00.244Z +- commits: + - subject: Only cleanup temporary decompressed files in child-writer + hash: 48b5e8b9d90fdd9df98e099db1947bb6b2490a5a + body: "" + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + nested: [] + - subject: Add .versionbot/CHANGELOG.yml + hash: 1f138f0ecc13046ffe4f0bce2795c492fc3d4486 + body: "" + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + nested: [] + - subject: Stop using node-tmp, use withTmpFile from etcher-sdk instead + hash: 73f67e99ca7608a43afb326ab4a63e9507b769a1 + body: "" + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + nested: [] + - subject: Update etcher-sdk from 5.2.2 to 6.1.0 + hash: 9114da2445df0df85fc97aa3d83797c72963aba6 + body: | + Update etcher-sdk from 5.2.2 to 6.1.0 + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + nested: + - commits: + - subject: Prefix temporary decompressed images filenames + hash: 58b0ba2d9362536a105ff2b1152915540a9efb1e + body: "" + footer: + Change-type: minor + change-type: minor + author: Alexis Svinartchouk + nested: [] + version: etcher-sdk-6.1.0 + date: 2021-02-03T13:41:11.058Z + - commits: + - subject: Ignore ENOENT errors on unlink in withTmpFile + hash: 7bb2a23c4e94dcda6a7b494fe0435c0b59b56b06 + body: > + The temporary file might have been already deleted by + cleanupTmpFiles + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + nested: [] + version: etcher-sdk-6.0.1 + date: 2021-02-02T14:57:11.116Z + - commits: + - subject: Export tmp and add prefix and postfix options + hash: bd80af3ec5a87229fb3aebe2c77787371ab20253 + body: "" + footer: + Change-type: major + change-type: major + author: Alexis Svinartchouk + nested: [] + version: etcher-sdk-6.0.0 + date: 2021-02-01T18:03:42.334Z + - commits: + - subject: upgrade lint + hash: 172bf453b5f96d6ebe06dc6564dec6613b97e3c7 + body: "" + footer: + Change-type: patch + change-type: patch + author: Zane Hitchcox + nested: [] + version: etcher-sdk-5.2.3 + date: 2021-01-26T12:07:58.336Z + - subject: Revert "Change some border colors to have higher contrast" + hash: 554bbcc780f96b007b5b28610e1c724fab863cb5 + body: | + This reverts commit 8c4edaabba832a5771caea69356e4d565a2c2e13. + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + nested: [] + - subject: Update electron to v9.4.1 + hash: 4db2289cfdd02f41523b6ece2982c22114372f40 + body: "" + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + nested: [] + - subject: Update etcher-sdk from 5.2.1 to 5.2.2 + hash: c15b56bc237207fd16b432c22e612c20f16b451a + body: | + Update etcher-sdk from 5.2.1 to 5.2.2 + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + nested: + - commits: + - subject: Update drivelist from 9.2.2 to 9.2.4 + hash: cebb5202f81572aac786c332c9c71c537602774c + body: | + Update drivelist from 9.2.2 to 9.2.4 + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + nested: + - commits: + - subject: Pass strings between methods as std::string instead of char * + hash: 1ec6a8ffc4c9e138b78210f0db84a9ebd6c9182b + body: > + - Fixes "basic_string::_M_construct null not valid" + exception + aborting program, because WCharToUtf8() returned NULL + in some cases, and NULL was being fed to string constructor. + - Fixes memory leak because memory allocated with + calloc() + in WCharToUtf8() was not being freed anywhere + - Fixes undefined behavior because GetEnumeratorName() + returns + pointer to stack memory, that goes outside of scope while + pointer still is being used. + + Closes #381 + + Closes #382 + footer: + Change-type: patch + change-type: patch + author: Floris Bos + version: drivelist-9.2.4 + date: 2021-01-19T13:27:50.033Z + - commits: + - subject: Support lsblk versions that do no support the pttype column + hash: a6d568bb64e53c0dc3aeb226cbd0b19bbb090671 + body: "" + footer: + Change-type: patch + change-type: patch + author: Alexis Svinartchouk + version: drivelist-9.2.3 + date: 2021-01-19T13:07:29.910Z + version: etcher-sdk-5.2.2 + date: 2021-01-19T17:24:06.603Z + version: 1.5.116 + date: 2021-02-03T13:58:32.420Z +- version: 1.5.115 + date: 2021-01-18T12:07:12.000Z + commits: + - hash: 361c32913ccab6dffacce47dbac22eac61b4abc9 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update etcher-sdk from 5.1.12 to 5.2.1 + body: Update etcher-sdk from 5.1.12 to 5.2.1 +- version: 1.5.114 + date: 2021-01-15T12:28:32.000Z + commits: + - hash: 93db90c725bdc56967eb73eace8cc09d6d4b1c70 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Disable screensaver while flashing (on balena-electron-env) + body: null + - hash: 3521b61a817e5094425b9c631ec5bd485f50c0e9 + author: Aaron Shaw + footers: + change-type: patch + signed-off-by: Aaron Shaw + subject: "docs: fix quote marks" + body: "Fix quote mark styling\r\n\r" + - hash: e8c7591751e8e6af9f49cfbcd6043da1b06477e7 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Fix typo in webpack.config.ts comment + body: null + - hash: b74069eb41e88826a26a893c43624001db919a62 + author: Alexis Svinartchouk + footers: + changelog-entry: Update webpack to v5 + change-type: patch + subject: Update webpack to v5 + body: null + - hash: f82996bfd1b7b562f2889eeddc5589df62817f5b + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update @balena/lint to 5.3.0 + body: null + - hash: 53954e81fd148f25da67d56cff32cf89171e13a4 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update dependencies + body: null + - hash: f9d7991dc8aaca8ebeeb56309f52ec7cc5141058 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update rendition from 18.8.3 to 19.2.0 + body: Update rendition from 18.8.3 to 19.2.0 + - hash: 1188888956ee2895e363efdfbe6d90d0b612064a + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update etcher-sdk from 5.1.11 to 5.1.12 + body: Update etcher-sdk from 5.1.11 to 5.1.12 + - hash: aa563c87bd4f8217212bc72a96c7785daeb1c26e + author: Alexis Svinartchouk + footers: + changelog-entry: Remove libappindicator1 debian dependency + change-type: patch + subject: Remove libappindicator1 debian dependency + body: null +- version: 1.5.113 + date: 2020-12-08T13:54:21.000Z + commits: + - hash: 8c4edaabba832a5771caea69356e4d565a2c2e13 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Change some border colors to have higher contrast + body: null + - hash: d3df2fe57eae0c05d031dabd3f4e0454d0b3849d + author: Alexis Svinartchouk + footers: + changelog-entry: Update sys-class-rgb-led from 2.1.1 to 3.0.0 + change-type: patch + subject: Update sys-class-rgb-led from 2.1.1 to 3.0.0 + body: Update sys-class-rgb-led from 2.1.1 to 3.0.0 + - hash: 05497ce85c063b0ebec8fe6a688a159643a246d6 + author: Alexis Svinartchouk + footers: + changelog-entry: Update etcher-sdk from 5.1.10 to 5.1.11 + change-type: patch + subject: Update etcher-sdk from 5.1.10 to 5.1.11 + body: Update etcher-sdk from 5.1.10 to 5.1.11 + - hash: 8c4edaabba832a5771caea69356e4d565a2c2e13 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Change some border colors to have higher contrast + body: null + - hash: 2f08142f5abe91b2ba09357c18e2750621484181 + author: bulldozer-balena[bot] + subject: "Merge pull request #3379 from balena-io/high-contrast-lines" + body: Change some border colors to have higher contrast + - hash: 409b78fc21c7d9b09e15671fcf085e54ac1ca357 + author: Alexis Svinartchouk + footers: + changelog-entry: Fix effective flashing speed calculation for compressed images + change-type: patch + subject: Fix effective flashing speed calculation for compressed images + body: null + - hash: c32e485f279d462a83f687d66b0a84158da815f5 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove dead code in settings modal + body: null + - hash: fe0b45cae63878ee9bdf40cea943ce29a484ff97 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Only show auto-updates setting on supported targets + body: null + - hash: 1f94f44b182ee24831bd3bd702df58e72faee807 + author: Alexis Svinartchouk + footers: + changelog-entry: Remove unmountOnSuccess setting + change-type: patch + subject: Remove unmountOnSuccess setting + body: null + - hash: de0010eb72240da28f4cebd8aa1830b4bad1f6f1 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update rgb leds colors + body: null + - hash: 3987078c11f7fefa32571e0f48dfab107d9d324e + author: Giovanni Garufi + footers: + change-type: patch + subject: Update npm to v6.14.8 + body: null + - hash: b1e4e681d12ffaf7dae1d7a06b9d0d76fcae40ca + author: Alexis Svinartchouk + footers: + changelog-entry: Update electron to v9.4.0 + change-type: patch + subject: Update electron to v9.4.0 + body: null + - hash: 36d05724c00015e7c655d6afbd66d9c8904f74cc + author: Alexis Svinartchouk + footers: + changelog-entry: Improve hover message when the drive is too small + change-type: patch + subject: Improve hover message when the drive is too small + body: null + - hash: b4b8c89aad31dcb191e54a2e96ec9feab94e3206 + author: Aaron Shaw + footers: + change-type: patch + signed-off-by: Aaron Shaw + subject: "docs: update macOS version" + body: "Update macOS version as latest version of Electron is 10.10 compatible + only (Yosemite)\r + + \r" + - hash: 3cde2faed0440926c8913e72100aa18562bacbb0 + author: Aaron Shaw + footers: + change-type: patch + closes: https://github.com/balena-io/etcher/issues/3191 + signed-off-by: Aaron Shaw + subject: "docs: add documentation links" + body: "add documentation and faq links\r\n\r" + - hash: fc45df270af35151027f231df4fd1d826d4b2bd2 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Fix red leds not showing for failed devices + body: null + - hash: c54856a616446b0ea3f9fd569a9558a2aeb5ede2 + author: Alexis Svinartchouk + footers: + changelog-entry: Show the first error for each drive (not the last) + change-type: patch + subject: Only store the first error for each target + body: null +- version: 1.5.112 + date: 2020-12-03T15:17:29.000Z + commits: + - hash: da3a22d0f6254c6563c3be5ec192300970880dab + author: Alexis Svinartchouk + footers: + changelog-entry: Set useContentSize to true so the size is the same on all platforms + change-type: patch + subject: Set useContentSize to true so the size is the same on all platforms + body: null + - hash: 8bd11a01aebedd8f83fee0ba95fc14ab37389e16 + author: Alexis Svinartchouk + footers: + changelog-entry: Update etcher-sdk from 5.1.5 to 5.1.10 + change-type: patch + subject: Update etcher-sdk from 5.1.5 to 5.1.10 + body: Update etcher-sdk from 5.1.5 to 5.1.10 + - hash: 3c0084d012f983241d1e2bb44971e44ffec41709 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Fix modal content height on Windows + body: null + - hash: 4e68955981827f4be5c50557e18e1f7d70297ac6 + author: Alexis Svinartchouk + footers: + change-type: none + subject: Target commit instead of branch name for sudo-prompt + body: null + - hash: 50730bd3dfa7058e2834a7571159e74cee59acd0 + author: Alexis Svinartchouk + footers: + change-type: none + subject: Fix imports in child-writer.ts + body: null + - hash: fa593e33d1568e4863ae0057b5133cc1dc2d10b7 + author: Alexis Svinartchouk + footers: + change-type: none + subject: Update repo.yml to enable nested changelogs + body: null + - hash: 2158e20380276240e725da4da5baa4a563be6a35 + author: Alexis Svinartchouk + footers: + changelog-entry: Improve flashing error handling + change-type: patch + subject: Improve flashing error handling + body: null + - hash: f46176fd105fbe9ac8d062bcd871af3f0a77105c + author: Alexis Svinartchouk + footers: + changelog-entry: Fix layout when the featured project is not showing + change-type: patch + subject: Fix layout when the featured project is not showing + body: null + - hash: edabacfb3a7a327557d00da02dbdc5d7cac2c54d + author: Alexis Svinartchouk + footers: + change-type: none + subject: Fix spectron test to work on Windows in all cases + body: null + - hash: 2e5a39dcd83cb614804c93859aff71cb1a91d237 + author: Alexis Svinartchouk + footers: + changelog-entry: Update sys-class-rgb-led from 2.1.0 to 2.1.1 + change-type: patch + subject: Update sys-class-rgb-led from 2.1.0 to 2.1.1 + body: Update sys-class-rgb-led from 2.1.0 to 2.1.1 + - hash: 3647457bb5793fbf42b34840d1678f78715eff30 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Add rendition and sys-class-rgb-led to repo.yml + body: null +- version: 1.5.111 + date: 2020-11-23T17:52:39.000Z + commits: + - hash: 560ed91e2ec02a9abb8a62da78312fdfa68930e4 + author: Alexis Svinartchouk + footers: + changelog-entry: Update etcher-sdk to 5.1.1, use WASM ext2fs module + change-type: patch + subject: Update etcher-sdk to 5.1.1, use WASM ext2fs module + body: null + - hash: bddb89e4a1c7b6ef75e7b1762d725e219239ebc0 + author: Alexis Svinartchouk + footers: + changelog-entry: Update electron to v9.3.3 + change-type: patch + subject: Update electron to v9.3.3 + body: null + - hash: e2c2b4069030e0fce9c928e1d113c8f63419674d + author: Alexis Svinartchouk + footers: + changelog-entry: Remove "Validate write on success" setting. Validation is + always enabled, press the "skip" button to skip it. + change-type: patch + subject: Remove "Validate write on success" setting + body: Validation is always enabled, press the "skip" button to skip it. + - hash: 1c52379ee3da40306ae2c14751f9026d59e7a6c3 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Add drivesOrder setting + body: null + - hash: e58cfd89c58649ed3ae32e2304495f31b057d865 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Add successBannerURL setting + body: null + - hash: ef3b8915d895d59ea4878137d5b4280056ca912b + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update etcher-sdk to 5.1.2 + body: null + - hash: 1e0a6a3129735641dc9920eec7ae9acd7495afce + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Removed disableExplicitDriveSelection setting, use autoSelectAllDrives + instead + body: null + - hash: e7b4f0902166cc78dfbf728a6c708586667fb884 + author: Alexis Svinartchouk + footers: + changelog-entry: Allow selecting a locked SD card as the source drive + change-type: patch + subject: Allow selecting a locked SD card as the source drive + body: null + - hash: 644d955f08756cacab866d4bdeb1031fb6f84049 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Prevent opening more than one file selector + body: null + - hash: e37ae2743f20d08cd2c2c7dafa55053fc4228aa9 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update etcher-sdk to 5.1.3 + body: null + - hash: a2c7a542df3c64e5d91e8ebe70b14abe0c0d1854 + author: Alexis Svinartchouk + footers: + changelog-entry: Use a different icon when no source drive is available + change-type: patch + subject: Use a different icon when no source drive is available + body: null + - hash: af2b6bc8ca0cdd0b68b62d54a208cad8c4553a1a + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update typescript to 4.1.2 + body: null + - hash: 0597c0e908c952eb424efe0c06c37addb775b06e + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update etcher-sdk to 5.1.5 + body: null + - hash: c69b2fa053241d6d32073df09c363b1f9d2b7f85 + author: Alexis Svinartchouk + footers: + changelog-entry: Warn when the source drive has no partition table + change-type: patch + subject: Warn when the source drive has no partition table + body: null + - hash: 446e8e1253091ea65f518f23ab3fbed74eff4189 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update bl + body: null +- version: 1.5.110 + date: 2020-11-05T11:54:37.000Z + commits: + - hash: db09b7440d4172df4f416bb287013d92d2ee126c + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Rework success screen + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Rework success screen + body: null + - hash: 7e7ca9524e6486fdccc59fc4964454be8d925e30 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Add skip function to validation + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Add skip function to validation + body: null + - hash: e484ae98372ab7661e62e4a0cb79420edcc87325 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Cleanup after child-process is terminated + body: null + - hash: 611e6596268f43f3cff3b463dec87001a5498c0a + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Add retry button to the errors modal in success screen + body: null + - hash: 06997fdf291d675f1059d33b38da93ff9557e2eb + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Fix zoomFactor in webviews + body: null + - hash: e74dc9eb6002202e392cd55b841b0ed4be777fa4 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Update rendition to v18.8.3 + body: null + - hash: 31409c61ca1cf0b7e66195ad8190eb081bef017c + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Use drive-selector's table for flash errors table + body: null + - hash: a7637ad8d45164dad290edf3a4250579d225de7a + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Fix settings spacing + body: null + - hash: 640a7409ee364bedc89d812786ed293a20a1492f + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Add dash on table when selecting only some rows + body: null + - hash: 4872fa3d6e975385df81a1615d1fcb742c6f82a8 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Fix URL not being selected with custom protocol + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Fix URL not being selected with custom protocol + body: null + - hash: deb3db0fff97358a1fb3c47d761179be4b0acbb5 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Add more typings & refactor code accordingly + body: null + - hash: 6c49c71b3fe6eb02da290a7c53a889de052439bf + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Remove console.log in tests + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Remove console.log in tests + body: null + - hash: 40e5fb22878576488c5896c266beb8770184b5db + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Add primary colors to default flow + body: null +- version: 1.5.109 + date: 2020-09-14T16:25:48.000Z + commits: + - hash: 7c2644ec51097e9251ac587845552ac23036084c + author: Alexis Svinartchouk + footers: + changelog-entry: Workaround elevation bug on Windows when the username contains + an ampersand + change-type: patch + subject: Workaround elevation bug on Windows when the username contains an + ampersand + body: null + - hash: 0a28a7794d4a5fa2fb55e11999b69d3a982536d3 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update ext2fs to v2.0.5 + body: null +- version: 1.5.108 + date: 2020-09-10T17:31:36.000Z + commits: + - hash: b9076d01af583572aa914968994b2c6e05f9c88c + author: Alexis Svinartchouk + footers: + changelog-entry: Fix content not loading when the app path contains special characters + change-type: patch + subject: Fix content not loading when the app path contains special characters + body: null +- version: 1.5.107 + date: 2020-09-07T09:48:17.000Z + commits: + - hash: 377dfb8e220276549364094ea9c1a88cdd63f50c + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Split drive selector from target selector + body: null + - hash: dda022df37133d638808bae4271982789d8e584f + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Add clone-drive workflow + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Add clone-drive workflow + body: null + - hash: bb04098062f84462200468159510cc4b77cb9ea5 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Reword macOS Catalina askpass message + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Reword macOS Catalina askpass message + body: null + - hash: aa72c5d3bb051f552ab3cfd0a67681dcc5407e53 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Ignore vscode workspace folder + body: null + - hash: 42838eba095220ecb254aadc314df5d88822d170 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Override cached window's zoomFactor + body: null + - hash: 093008dee7a936c91b9ecdde8bebee9e6dace5b5 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Rework system & large drives handling logic + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Rework system & large drives handling logic + body: null + - hash: 8fa6e618c4d52f4ec5e5c9fc93c74fb301c789c9 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Use pretty-bytes instead of custom function + body: null + - hash: 14a89b3b8a25ae82e153e56bc97fcad983e1bbf4 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Remove lodash from selection-state.ts + body: null + - hash: f9d79521a11f09fdd2a31ccba9de096a11b292eb + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Fix tests not running + body: null + - hash: 3e45691d0b207eb476df38a1b2250ffe4fa91fa7 + author: Alexis Svinartchouk + footers: + changelog-entry: Re-enable ext partitions trimming on 32 bit Windows + change-type: patch + subject: Re-enable ext partitions trimming on 32 bit Windows + body: null + - hash: eeab35163658c982f9ec35f37b40649d5f99fad6 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Fix tests hanging on array.flatMap + body: null + - hash: b76366a514edd494188cfdc6eccbd2a1d2c49c61 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Add more typings & refactor code accordingly + body: null +- version: 1.5.106 + date: 2020-08-27T16:16:31.000Z + commits: + - hash: 7894a67719cb178f3465ec05cf7ac107e3dc7610 + author: Alexis Svinartchouk + footers: + changelog-entry: Fix opening zip files from servers accepting Range headers + change-type: patch + subject: Fix opening zip files from servers accepting Range headers + body: null + - hash: 688d697a996cb362aa4dab8346cd8ea893619b76 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update typescript to ^4 + body: null + - hash: 991cbf6b7f055f5588dff0e6da06653aa5d8803a + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update etcher-sdk to 4.1.28 + body: null + - hash: 5e5f82c4b529e90a26adad6ffdb7386bf1a13321 + author: Alexis Svinartchouk + footers: + changelog-entry: Disable ext partitions trimming on 32 bit windows until it is fixed + change-type: patch + subject: Update etcher-sdk to 4.1.29 + body: null +- version: 1.5.105 + date: 2020-08-26T11:11:17.000Z + commits: + - hash: b7f8c8368c1e79b15725edf5580ca7385d397dc7 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Fix settings button not being clickable + body: null + - hash: 34489f0d6667bcde4382ce20e5b4b9e4d31912ce + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update etcher-sdk to 4.1.25 + body: null + - hash: 27e560c96130b328c120941dfc5bbb5f3ee73e96 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update rendition to ^18.4.1 + body: null + - hash: fff9452509d16956b126f413f1f1ebe9c7c2289e + author: Alexis Svinartchouk + footers: + changelog-entry: Spinner for URL selector modal + change-type: patch + subject: Spinner for URL selector modal + body: null + - hash: 92dfdc6edd6f214aa50500d56f0ef6ecc062de44 + author: Alexis Svinartchouk + footers: + changelog-entry: URL selector cancel button cancels ongoing url selection + change-type: patch + subject: URL selector cancel button cancels ongoing url selection + body: null + - hash: 55cafb92681f24dc08d91ad5b5ab41528871b062 + author: Alexis Svinartchouk + footers: + changelog-entry: Update etcher-sdk to 4.1.26 + change-type: patch + subject: Update etcher-sdk to 4.1.26 + body: null + - hash: a17a919c37603d61fa6fe43229c285967a938722 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove unused SafeWebvuew.refreshNow property + body: null + - hash: 8ed5ff25a5bafd73810f902a7974462538d16b2d + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove unused FeaturedProject.state.show + body: null + - hash: a485d2b4df990a4e31b39c54be303c3b019e0ec1 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove FeaturedProject class, replace with SafeWebview + body: null + - hash: c9bfd350ed039902f54cb306bc10a7a1464d9684 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove unused FlashStep.props.isWebviewShowing + body: null + - hash: 2c07538f8f6c232969f3410931ed82cb3575c67a + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Simplify MainPage + body: null +- version: 1.5.104 + date: 2020-08-21T12:59:25.000Z + commits: + - hash: a7c34315562342b93942987a0cb25249bf611fad + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove unused error message + body: null + - hash: 9797a2152de30b5c9ee8d17fbf1947184cab4077 + author: Alexis Svinartchouk + footers: + changelog-entry: Update electron to v9.2.1 + change-type: patch + subject: Update electron to v9.2.1 + body: null + - hash: 46663e3a6f4624ca4de0784a068e4c003c97770a + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove no longer used @types/bluebird + body: null + - hash: 6eab47259e3c47c86f36bf2f9f236c88491dd29b + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove no longer used @types/request + body: null + - hash: 7f9add3f1e813c4a3827dd1804f7c2e933869599 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove no longer used nan + body: null + - hash: 548475996c36baca13737df49c10571518ebff85 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove duplicated styled-system + body: null + - hash: 24c8ede746a3939fc18fa821bc9f3e8d5d52437d + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove unused part of Makefile + body: null + - hash: 08716efbd5d7e949cbc5476e9b1215b9f00fade3 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update rendition to 18.1.0 + body: null + - hash: a24be20e952ac041755b8e29c84cd72d1149d6c9 + author: Alexis Svinartchouk + footers: + changelog-entry: Fix writing config file + change-type: patch + subject: Fix writing config file + body: null + - hash: 6cb914e9697030136086d00ac2f87ce28582342c + author: Alexis Svinartchouk + footers: + chanelog-entry: Update etcher-sdk to v4.1.24 + change-type: patch + subject: Update etcher-sdk to v4.1.24 + body: null +- version: 1.5.103 + date: 2020-08-19T11:55:07.000Z + commits: + - hash: 3b105d5a6a1436a085af9456bfaba81469c15d85 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update etcher-sdk to ^4.1.20 + body: null + - hash: 0bf1ec495800f03602be18f73bb8674ef18017b9 + author: Alexis Svinartchouk + footers: + changelog-entry: Remove Bluebird + change-type: patch + subject: Remove Bluebird + body: null + - hash: 482c29bc2abc960a36536dabc6e74176c2e22c60 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update dependencies + body: null + - hash: f8e21e2338b3f97589ea23f8d5699409d207317a + author: Alexis Svinartchouk + footers: + changelog-entry: User regular stream in lzma-native instead of readable-stream + change-type: patch + subject: User regular stream in lzma-native instead of readable-stream + body: null + - hash: 76fa698995337847af9bc750262ad6517dcebfd5 + author: Alexis Svinartchouk + footers: + changelog-entry: Optimize svgs + change-type: patch + subject: Optimize svgs + body: null + - hash: f2a37079eb36c4b07c722afbb46389d63b440803 + author: Alexis Svinartchouk + footers: + changelog-entry: Don't use lodash in child-writer.js + change-type: patch + subject: Don't use lodash in child-writer.js + body: null + - hash: 481be42eb5bf2ed71fa4734a75e29f7c9277e6df + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update etcher-sdk to ^4.1.22 + body: null + - hash: 140f3452ed2494a8dc449b54c3d6fcfa96ed3c49 + author: Alexis Svinartchouk + footers: + changelog-entry: Don't import WeakMap polyfill in deep-map-keys + change-type: patch + subject: Don't import WeakMap polyfill in deep-map-keys + body: null + - hash: 281f1194561123f138a77064934c405f3d72aa04 + author: Alexis Svinartchouk + footers: + changelog-entry: Replace native elevator with sudo-prompt on windows + change-type: patch + subject: Replace native elevator with sudo-prompt on windows + body: null + - hash: a3322e9fd75b7db0f6a745a2bdea2452a18c8bfe + author: Alexis Svinartchouk + footers: + changelog-entry: "Set module: es2015 in tsconfig.json" + change-type: patch + subject: "Set module: es2015 in tsconfig.json" + body: null + - hash: ac2d4ae8f32071e94fe56e1011fd32569526c344 + author: Alexis Svinartchouk + footers: + changelog-entry: Move linting and testing into package.json + change-type: patch + subject: Move linting and testing into package.json + body: null + - hash: fbacb8187d64f13d624776fed70f2c7943cd500d + author: Alexis Svinartchouk + footers: + changelog-entry: Update etcher-sdk to ^4.1.23 + change-type: patch + subject: Update etcher-sdk to ^4.1.23 + body: null + - hash: 1f44f3944f7a802dc7dd78fb06cd83b18637b151 + author: Alexis Svinartchouk + footers: + changelog-entry: Update electron to 9.2.0 + change-type: patch + subject: Update electron to 9.2.0 + body: null + - hash: 540fe9060907e70aa02a88745670e98f7932baca + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Fix running tests on Windows + body: null + - hash: 0c59168ceb799c62366a649fe3ad4b467f0721f6 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Change isFocused check to isVisible in tests + body: null + - hash: 5fbaa3a3db1789eda064659b7a6d2b2aa2821e38 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update @balena/udif, don't bundle htmlparser2 into the writer + body: null + - hash: 9f29dc8b76793b7fe34970602bf9634e0ce5f0dd + author: Alexis Svinartchouk + footers: + changelog-entry: Update rendition to ^17 + change-type: patch + subject: Update rendition to ^17 + body: null + - hash: bc092114c1f7645cd1efdce947359ff61d0d2171 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Don't use more than a 8th of the system memory as buffers + body: null + - hash: 88ae9fcbd1a067cd5c4659f30904c7ce6e8c3dde + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update dependencies + body: null +- version: 1.5.102 + date: 2020-07-27T15:55:15.000Z + commits: + - hash: 175e41de8d162a94005d157b6df9b36de10fa799 + author: Alexis Svinartchouk + footers: + changelog-entry: Update rendition to ^16.1.1 + change-type: patch + subject: Update rendition to ^16.1.1 + body: null + - hash: 5eac622b8c74ac3c3ad78b34d9e60c45205768a6 + author: Alexis Svinartchouk + footers: + changelog-entry: Use strict typescript compiler option + change-type: patch + subject: Use strict typescript compiler option + body: null + - hash: 7d53d0aadcac2d07336afd255de0965ea5666f19 + author: Alexis Svinartchouk + footers: + changelog-entry: Use tslib + change-type: patch + subject: Use tslib + body: null + - hash: 170126a490e805b9d14fa2b3e747cba3277cbae9 + author: Alexis Svinartchouk + footers: + changelog-entry: Remove no longer used .sass-lint.yml + change-type: patch + subject: Remove no longer used .sass-lint.yml + body: null + - hash: e72049d6e8cfc073ae539ab3b16ef9ecf0382fbf + author: Alexis Svinartchouk + footers: + changelog-entry: Remove font awesome unused icons from the generated bundle + change-type: patch + subject: Remove font awesome unused icons from the generated bundle + body: null + - hash: dc9351713cd4e78513781c3a8c31a0b822f78451 + author: Alexis Svinartchouk + footers: + changelog-entry: Stop using request, replace it with already used axios + change-type: patch + subject: Stop using request, replace it with already used axios + body: null + - hash: 3218fc2c8352ebf710c87ae4fb086cc9e576b6db + author: Alexis Svinartchouk + footers: + changelog-entry: Split main process and child-writer js files + change-type: patch + subject: Split main process and child-writer js files + body: null + - hash: 963fc574c3569127da7cfce75642e50d5b226c3e + author: Alexis Svinartchouk + footers: + changelog-entry: Centralize imports in child-writer + change-type: patch + subject: Centralize imports in child-writer + body: null + - hash: 512785e0a96c5c24792a034fbb2b56c2c67926ab + author: Alexis Svinartchouk + footers: + changelog-entry: Remove bluebird from main process, reduce lodash usage + change-type: patch + subject: Remove bluebird from main process, reduce lodash usage + body: null + - hash: 44c74f33d933141b5dde1929fb3f421347d2a32e + author: Alexis Svinartchouk + footers: + changelog-entry: Electron 9.1.1 + change-type: patch + subject: Electron 9.1.1 + body: null + - hash: 3f59d35fb6c5f9215715ccbc44b7443dd73e58c9 + author: Alexis Svinartchouk + footers: + changelog-entry: Fix flashing truncated images, fix flashing large dmgs + change-type: patch + subject: Update etcher-sdk to ^4.1.19 + body: null +- version: 1.5.101 + date: 2020-07-09T16:37:27.000Z + commits: + - hash: 9b71772e3532b57ff57dc5944f190ba4363f5d1b + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Refactor UI grid to use rendition + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Refactor UI grid to use rendition + body: null + - hash: 76086a8f915c4784198be38373b19f63511144d2 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Rework and move flashing view elements + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Rework and move flashing view elements + body: null + - hash: 8ce9eac7040e217f0e8a5c48e1d55cb338da6852 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Remove bootstrap & flexboxgrid + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Remove bootstrap & flexboxgrid + body: null + - hash: 00f193541d9efe87de94e90e2b86cbce8dfa0865 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Restyle modals + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Restyle modals + body: null + - hash: 3ca50a1e2d95c73890009ffe1df9243a9a9df045 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Refactor UI without bootstrap & flexboxgrid + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Refactor UI without bootstrap & flexboxgrid + body: null + - hash: 098ca9a9a1fb4e06211e95925bd559c7c336d55e + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Remove unused warning in settings + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Remove unused warning in settings + body: null + - hash: 8560189a1e11b5f572abd4859341bb52961517ce + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Remove unused scss + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Remove unused scss + body: null + - hash: 784dd03ba758d7fa5e217875bf300aa45d545d32 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Convert sass to plain css + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Convert sass to plain css + body: null + - hash: 394d3e0bf2d52ee2415b3e1996ebd17992323b7f + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Update etcher-sdk to v4.1.16 + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Update etcher-sdk to v4.1.16 + body: null + - hash: 692274691ee23a34be3c5db130e0432edea375dc + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove non relevant comment + body: null + - hash: ba29d76a000cdd9a60f09394f431c89b1ca05848 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update electron to 9.0.5 + body: null + - hash: 05d0f7142da807e4c6f603b7f49f8d19b02c592c + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update rendition to 15.2.4 + body: null + - hash: 953f572b53b93ebe21bfe0f8ce0ad456541dfdb1 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Fix modal not showing overflowing elements + body: null + - hash: c8737806c0e6e2022ba4d4654110bd23d00b6470 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove unused packages + body: null + - hash: e5ee0f1961a06ec662882cdc86ece35761ef74ed + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Mount source drive if automountOnFileSelect is set + body: null + - hash: 391e4444d4a3f65c48b844dafc7a438b36fab482 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Deselect the image if the source drive is removed + body: null + - hash: 9bde38df5ad3d0e1b59038e55637cbc0e26f0ff6 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update etcher-sdk to 4.1.17 + body: null + - hash: 5c5273bd6cd426d0d424d29fc51ec4b4d45c5b48 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: autoSelectAllDrives setting + body: null + - hash: 630f6c691c02917c4c52e0bce4a01f37ae243416 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Resize modal to show content appropriately + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Resize modal to show content appropriately + body: null +- version: 1.5.100 + date: 2020-06-22T16:08:48.000Z + commits: + - hash: f8cc7c36b4888babf65e65ba6f622e28306505aa + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Add warning color to Flash! button + body: null + - hash: 71c7fbd3a28b84821f23d34e190d9b0365e96be2 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Rework target selector modal + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Rework target selector modal + body: null + - hash: b0c71b21b3a4e25bc062df60c6bba94ebd97170a + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Merge unsafe mode with new target selector + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Merge unsafe mode with new target selector + body: null + - hash: af9d3ba9f120a6768535ba4f2f6f6e18f87c9679 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Update rendition to v15.0.0 + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Update rendition to v15.0.0 + body: null + - hash: 7aec8a4ae23b9b2646e840dd6547f07fd92801e2 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Refactor styles + body: null + - hash: 2dc359b19c34019c1fdeac3bcbfab1a339975d79 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Make TargetSelectorModal a React.Component + body: null + - hash: e39fed1f258f53d19a7e03d44f65eedec1e5263a + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Fix source-selector image height + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Fix source-selector image height + body: null + - hash: d63f5eca0d35164dab69ba1a4d57743442a08f09 + author: Alexis Svinartchouk + footers: + changelog-entry: Update rendition to 15.2.1 + subject: Update rendition to 15.2.1 + body: null + - hash: 9444f0e1b121bf8ac65f6b77ca92be26b06a38e1 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Stricter types in target-selector-modal.tsx + body: null + - hash: 6554ccf0f8f90dfe9aefefcb512b275cee8650c9 + author: Alexis Svinartchouk + footers: + changelog-entry: Sticky header in target selection table + change-type: patch + subject: Sticky header in target selection table + body: null + - hash: 92cd3d688d0492f961e6214e9ad20790774ab631 + author: Alexis Svinartchouk + footers: + changelog-entry: Update etcher-sdk to v4.1.15 + change-type: patch + subject: Update etcher-sdk to v4.1.15 + body: null + - hash: a360370c4e861a1b60e174790acfa82f795fb868 + author: Alexis Svinartchouk + footers: + changelog-entry: Update electron to v9.0.4 + change-type: patch + subject: Update electron to v9.0.4 + body: null + - hash: 07fde0d73ffd38b05315d3fa4f953f9bb97922b8 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Don't mutate usbboot drives when updating progress + body: null + - hash: 7165a8190b4a7d57dbfaeb7748fb28826f4a8cd1 + author: Alexis Svinartchouk + footers: + changelog-entry: Update electron-notarize to v1.0.0 + change-type: patch + subject: Update electron-notarize to v1.0.0 + body: null + - hash: 129e7e20e8bba1381be071c80abfeb0dde25e517 + author: Alexis Svinartchouk + footers: + changelog-entry: Update mocha to v8.0.1 + change-type: patch + subject: Update mocha to v8.0.1 + body: null + - hash: 5a45f8b122046ebfb8a29af4b49d0bb74f2b8afe + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update target selector ok button label to show the number of selected + devices + body: null + - hash: 406955ca3eb948b6be7c56dea79e4166a6c88738 + author: Alexis Svinartchouk + footers: + changelog-entry: Add .vhd to the list of supported extensions, allow opening any file + change-type: patch + subject: Add .vhd to the list of supported extensions, allow opening any file + body: null + - hash: 14e4cbf749b40664eb30f6678cfcd9fc28f7b140 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Add icon to plug targets in targets modal + body: null + - hash: b32c4ee728adcb00d38f286beb456c3d8ecb6b8f + author: Alexis Svinartchouk + footers: + changelog-entry: Update partitioninfo to 5.3.5 + change-type: patch + subject: Update partitioninfo to 5.3.5 + body: null + - hash: ba16995070491690f3060b3b75a7ca07e70ead9a + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Show system drives last + body: null +- version: 1.5.99 + date: 2020-06-12T12:29:12.000Z + commits: + - hash: f01f1ddd7a4c5fdb141e5e20472357525a73a9d0 + author: Alexis Svinartchouk + footers: + changelog-entry: Inline all svgs + change-type: patch + subject: Inline all svgs + body: null + - hash: 03e3354d500fd7d5af342cc15977ece233bb2461 + author: Alexis Svinartchouk + footers: + changelog-entry: Update electron to 9.0.3 + change-type: patch + subject: Update electron to 9.0.3 + body: null + - hash: 62b42e92549dfbc40d9d1ee7ad6ea84974e0d745 + author: Alexis Svinartchouk + footers: + changelog-entry: Update node-raspberrypi-usbboot to 0.2.8 + change-type: patch + subject: Update node-raspberrypi-usbboot to 0.2.8 + body: null +- version: 1.5.98 + date: 2020-06-10T20:34:03.000Z + commits: + - hash: b1376dfa73fe9f450c0c0d3be33d7912ef991a52 + author: Alexis Svinartchouk + footers: + changelog-entry: Update etcher-sdk to ^4.1.13 + change-type: patch + subject: Update etcher-sdk to ^4.1.13 + body: null + - hash: 52bdd02a4b7b17e5821f96faa04d2c280d7e27c9 + author: Alexis Svinartchouk + footers: + changelog-entry: Check that argument is an url or a regular file before opening + change-type: patch + subject: Check that argument is an url or a regular file before opening + body: null + - hash: 59e37182be060c008f5801cfc1eef7a5ee32224c + author: Alexis Svinartchouk + footers: + changelog-entry: Use between 2 and 256MiB for buffering depending on the number + of drives + change-type: patch + subject: Use between 2 and 256MiB for buffering depending on the number of drives + body: null +- version: 1.5.97 + date: 2020-06-08T15:05:58.000Z + commits: + - hash: 5f5c66e3f2132a63347397a7ff2f6a2360f8f7c1 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Allow skipping notarization when building package (dev) + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Allow skipping notarization when building package + body: null + - hash: f0bbd1a1cda2ea1ef1cf87cf8f82c0d4f6de647a + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Fix windows ia32 rebuild + body: null + - hash: b7e82f7694989dd525eacb98b4589048d846848b + author: Alexis Svinartchouk + footers: + changelog-entry: Fix sudo-prompt promisification + change-type: patch + subject: Fix sudo-prompt promisification + body: null + - hash: 28f9954661f28a9391fa83bf6b58fc9b5a208fe3 + author: Alexis Svinartchouk + footers: + changelog-entry: Update etcher-sdk to ^4.1.6 + change-type: patch + subject: Update etcher-sdk to ^4.1.6 + body: null + - hash: 7e7a66911644549b085294ac86ea3d1d2a09efed + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Simplify spectron tests + body: null + - hash: 1449478c5b5b062e601f9d24bb8e0c83b418f82c + author: Alexis Svinartchouk + footers: + changelog-entry: Read image path from arguments, register `etcher://...` protocol + change-type: patch + subject: Read image path from arguments, register `etcher://...` protocol + body: null + - hash: f983d88e52757d653f20eed694738796891b1e49 + author: Alexis Svinartchouk + footers: + changelog-entry: Update etcher-sdk to ^4.1.8 + change-type: patch + subject: Update etcher-sdk to ^4.1.8 + body: null + - hash: 29e2e9c65749671b08fa5369f7a8a8687da557ff + author: Alexis Svinartchouk + footers: + changelog-entry: Avoid random access in http sources + change-type: patch + subject: Avoid random access in http sources + body: null + - hash: b749c2d45a91de51adec307838af2acafc2033d3 + author: Alexis Svinartchouk + footers: + changelog-entry: Fix flash from url on windows + change-type: patch + subject: Fix flash from url on windows + body: null + - hash: 3fa961197165b773000127ae156480cc75ac6716 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Don't check child-writer stderr, rely on the exit code instead + body: null + - hash: 3259a8206f6259cff6fccaa384f6d3db6126ee68 + author: Alexis Svinartchouk + footers: + changelog-entry: Update electron to v9.0.2 + change-type: patch + subject: Update electron to v9.0.2 + body: null + - hash: fcc9c5e5772cf8a01dcbf81e6e12d446fd6cd1c9 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update node-gyp to ^7.0.0 + body: null + - hash: f05f9d33f9b3b3d7dfdbf6ee93f531908fdef24f + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Use @types/copy-webpack-plugin + body: null + - hash: b43ec4414e7b624b81bd9b2525c92ed6265829f9 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update @types/terser-webpack-plugini to ^3.0.0 + body: null +- version: 1.5.96 + date: 2020-06-03T13:04:33.000Z + commits: + - hash: afa29a0ed181a3bdcc97c622183cc896ba35e258 + author: Alexis Svinartchouk + footers: + changelog-entry: Remove unused styles + change-type: patch + subject: Remove unused styles + body: null + - hash: 0ebfecc60c45d785d9cf130336d43780ab1d27ac + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Make FlashStep a PureComponent + body: null + - hash: e9f9f9013721b5b37c6cd8f3d4b5f725cae5d939 + author: Alexis Svinartchouk + footers: + changelog-entry: Update rendition to ^14.13.0 + change-type: patch + subject: Update rendition to ^14.13.0 + body: null + - hash: 95ff5c98a81a86262a72f0b2ba48234c456894fe + author: Alexis Svinartchouk + footers: + changelog-entry: Change font to SourceSansPro and fix hover color + change-type: patch + subject: Change font to SourceSansPro and fix hover color + body: null + - hash: 6db0172a5001642c17fe76252d02789a308d073f + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove useless StepSelection component + body: null + - hash: 4880275e7bbc3705c3454dc007a758622e27f6f0 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Simplify FlashAnother button + body: null + - hash: f5c7dc932a2f25989499419c65d2a5ddd091eec9 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove unused css class + body: null + - hash: 34349f64d5cae3b70a0245c407e4470a2950b354 + author: Alexis Svinartchouk + footers: + changelog-entry: Update progress bar style + change-type: patch + subject: Update progress bar style + body: null + - hash: ba21da4f0bc1d1a972a8246b58ede81782a42d35 + author: Alexis Svinartchouk + footers: + changelog-entry: Add effective speed in flash results + change-type: patch + subject: Add effective speed in flash results + body: null + - hash: 9c25cc663abcd197849f0a5b0f325b4b10bc14d1 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove unused styles + body: null + - hash: a4366556c02f9d19be156e1495c1efbffc15b8f7 + author: Alexis Svinartchouk + footers: + changelog-entry: Remove writing speed from finish screen + change-type: patch + subject: Remove writing speed from finish screen + body: null + - hash: 10b028355fe8e4d456e0217f92112cf46e8f0e82 + author: Alexis Svinartchouk + footers: + changelog-entry: Fix ia32 builds for windows + change-type: patch + subject: Fix ia32 builds for windows + body: null +- version: 1.5.95 + date: 2020-06-01T10:37:37.000Z + commits: + - hash: bb6d909949f040cc272b99da7058c106218f0605 + author: Juan Cruz Viotti + footers: + changelog-entry: "spectron: Make tests pass on Windows Docker containers" + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "spectron: Make tests pass on Windows Docker containers" + body: |- + The Spectron test that we have that checks that the browser window is + visible fails when ran inside a Windows Docker container. + In particular, the `isVisible()` function returns `false` when running + in a headless Windows machine. + However, the `isMinimized()` function returns `false`, the `isFocused()` + function returns `true`, and we can fetch the expected browser window + bounds, so we can use all those values in conjunction to reformulate the + test case and avoid `isVisible()`. + The results should be pretty much the same, and the assertions will pass + inside Docker Windows containers. +- version: 1.5.94 + date: 2020-05-27T21:10:43.000Z + commits: + - hash: e33172060f8c45d817b3cf7a761129760954bf65 + author: Alexis Svinartchouk + footers: + changelog-entry: Update etcher-sdk to ^4.1.4 + change-type: patch + subject: Update etcher-sdk to ^4.1.4 + body: null + - hash: 11bda8e76a576064c6e7e64cfc7dfa453eb56575 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove electron-builder patch now that + https://github.com/electron-userland/electron-builder/pull/4993 is + merged + body: null + - hash: 4e08cf38797c2a1136905077fe11423e9ac24bca + author: Alexis Svinartchouk + footers: + changelog-entry: Fix flash from url (broken in 1.5.92) + change-type: patch + subject: Fix flash from url (broken in 1.5.92) + body: null + - hash: 4752fa6dd2b302ba2edf3763be86bd3ae58a2ec7 + author: Alexis Svinartchouk + footers: + changelog-entry: Stop checking file extensions + change-type: patch + subject: Stop checking file extensions + body: null + - hash: aee3a0a2812c48b02e23490fa2c33cf74b74f5c8 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Show image name and path in image name modal + body: null +- version: 1.5.93 + date: 2020-05-25T17:33:57.000Z + commits: + - hash: d5df3de1d76abb1fa50622e123ab5e3e43cb4f66 + author: Alexis Svinartchouk + footers: + changelog-entry: Update electron to v9.0.0 + change-type: patch + subject: Update electron to v9.0.0 + body: null + - hash: bf26d4ec9577f94a7a3a2cc754d6c549367341ee + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove dead code + body: null + - hash: 880e56e563bd0843685f64aa6a1afc1e0ae2c09c + author: Alexis Svinartchouk + footers: + changelog-entry: Strip out comments from generated code + change-type: patch + subject: Strip out comments from generated code + body: null + - hash: 688e7fff9c9a1682c5475d97033a89eab489091e + author: Alexis Svinartchouk + footers: + changelog-entry: Update electron-builder to v22.6.1 + change-type: patch + subject: Update electron-builder to v22.6.1 + body: null + - hash: c0a4fb16e26444460ea457dbec2440a2f49f5149 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update dependencies + body: null + - hash: ed3b7f79714458b0ec5021d9adf4524cfd5ca9ae + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Patch electron-builder to fix signing on macos + body: |- + Remove this once + https://github.com/electron-userland/electron-builder/pull/4993 is + merged +- version: 1.5.92 + date: 2020-05-25T10:07:46.000Z + commits: + - hash: 1ebc8e936247c2cf87a07243d952f60a5b13c548 + author: Alexis Svinartchouk + footers: + changelog-entry: Webpack everything, reduce package size + change-type: patch + subject: Webpack everything, reduce package size + body: null + - hash: 33d48fe4f7152eef318703b7afabcec498183b01 + author: Alexis Svinartchouk + footers: + changelog-entry: Remove unneeded font formats + change-type: patch + subject: Remove unneeded font formats + body: null + - hash: b1fd539d25bd96bdcecdba58037d904c5577eb17 + author: Alexis Svinartchouk + footers: + changelog-entry: Remove unneeded fortawesome from main.scss + change-type: patch + subject: Remove unneeded fortawesome from main.scss + body: null + - hash: 2692104ccd7493ae8596fc70ee0313bdf5f3ad37 + author: Alexis Svinartchouk + footers: + changelog-entry: Disable asar packing on all platforms + change-type: patch + subject: Disable asar packing on all platforms + body: null + - hash: 09a6a340c9f730cae011940a5d109e2265e58a02 + author: Alexis Svinartchouk + footers: + changelog-entry: Use electron.app.getAppPath() instead of reading it from argv + in catalina-sudo + change-type: patch + subject: Use electron.app.getAppPath() instead of reading it from argv in + catalina-sudo + body: null +- version: 1.5.91 + date: 2020-05-21T14:22:55.000Z + commits: + - hash: c9cbe41f9eb38f5db65427ee17066d2700b199ae + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Minor fix - Init isSourceDrive param in correct place + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Init param in correct place + body: null + - hash: 31bd8ce7ae5b4b627209ece4ef850f695a2e8c25 + author: Rob Evans + footers: + fixes: "#3160" + change-type: patch + changelog-entry: Fix undefined image from DriveCompatibilityWarning + subject: Fix undefined image from DriveCompatibilityWarning + body: null +- version: 1.5.90 + date: 2020-05-20T15:23:37.000Z + commits: + - hash: d90e3a816e0cd9b23cee6af999730e12c6c49954 + author: Alexis Svinartchouk + footers: + changelog-entry: Update leds behaviour + change-type: patch + subject: Update leds behaviour + body: null + - hash: b71482284f2cedfab7fc920bd0426992b0e123d7 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove commented code + body: null + - hash: f9cbff1eec963b8dbf98d4016964a73f072e2e5a + author: Alexis Svinartchouk + footers: + change-type: patch + subject: ProgressButton is a PureComponent + body: null + - hash: a3a9edd41a0e570b996f58ff6379e53e2f8a3fc3 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Make Flash component a class & rename it FlashStep + body: null + - hash: 52f80293a29ba841112cd5cb75a13e5d6b877ea2 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove dead code + body: null + - hash: 72c9d616fd2aa05f4589e9af8385cb56f5beb16e + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove useless comment + body: null +- version: 1.5.89 + date: 2020-05-14T09:53:05.000Z + commits: + - hash: c5c0d46ab8d9c2e9fa9186ae5bce77cd360e785b + author: Alexis Svinartchouk + footers: + changelog-entry: Update @types/mocha 5 -> 7 + change-type: patch + subject: Update @types/mocha 5 -> 7 + body: null + - hash: 4257e696dacf19fcd6dd48d85d1c29ea7e5a8aa0 + author: Alexis Svinartchouk + footers: + changelog-entry: Update @types/semver 6 -> 7 + change-type: patch + subject: Update @types/semver 6 -> 7 + body: null + - hash: 84f003d907b0372430ef894faca06d36a2734ab6 + author: Alexis Svinartchouk + footers: + changelog-entry: Update @types/sinon 7 -> 9 + change-type: patch + subject: Update @types/sinon 7 -> 9 + body: null + - hash: b1cbf547110912399749708ed6ecc737928b4e57 + author: Alexis Svinartchouk + footers: + changelog-entry: Update @types/tmp 0.1.0 -> 0.2.0 + change-type: patch + subject: Update @types/tmp 0.1.0 -> 0.2.0 + body: null + - hash: 7bd8b0c1526878913e9fab71fa571bfde782856b + author: Alexis Svinartchouk + footers: + changelog-entry: Remove no longer used chalk dev dependency + change-type: patch + subject: Remove no longer used chalk dev dependency + body: null + - hash: 7099a36bdb7fb47387efa053d3f641c87d1eaaa6 + author: Alexis Svinartchouk + footers: + changelog-entry: Update electron-notarize 0.1.1 -> 0.3.0 + change-type: patch + subject: Update electron-notarize 0.1.1 -> 0.3.0 + body: null + - hash: 8782c706408dff9d74c77fd351a4e42a14be9dc7 + author: Alexis Svinartchouk + footers: + changelog-entry: Remove no longer used html-loader dev dependency + change-type: patch + subject: Remove no longer used html-loader dev dependency + body: null + - hash: a09e029216df198674cd18db7bc7b8e1d4767836 + author: Alexis Svinartchouk + footers: + changelog-entry: Update husky 3 -> 4 + change-type: patch + subject: Update husky 3 -> 4 + body: null + - hash: f1214e6ffd47b839cd48a47e9ad5616cef860f17 + author: Alexis Svinartchouk + footers: + changelog-entry: Update lint-staged 9 -> 10 + change-type: patch + subject: Update lint-staged 9 -> 10 + body: null + - hash: 5ab69dfb7fc284e21ac02b19b8d138f4ef8bae54 + author: Alexis Svinartchouk + footers: + changelog-entry: Update node-gyp 3 -> 6 + change-type: patch + subject: Update node-gyp 3 -> 6 + body: null + - hash: b0af9d535a06bff5d0823e4fe6ed919055c6dadf + author: Alexis Svinartchouk + footers: + changelog-entry: Update sinon 8 -> 9 + change-type: patch + subject: Update sinon 8 -> 9 + body: null + - hash: ad421eae117d24d5edf3ef325ab40a1c3231ff9b + author: Alexis Svinartchouk + footers: + changelog-entry: Update ts-loader 6 -> 7 + change-type: patch + subject: Update ts-loader 6 -> 7 + body: null + - hash: 627adb1755de5bc3db9608cf8f7da2d3309796c4 + author: Alexis Svinartchouk + footers: + changelog-entry: Update @types/node 12.12.24 -> 12.12.39 + change-type: patch + subject: Update @types/node 12.12.24 -> 12.12.39 + body: null + - hash: 92801133503d696c83ea0a2acaeef1cd1602263b + author: Alexis Svinartchouk + footers: + changelog-entry: Update all dependencies minor versions + change-type: patch + subject: Update all dependencies minor versions + body: null + - hash: 943765bd4d79cba1644c98c22790321c8b9711f8 + author: Alexis Svinartchouk + footers: + changelog-entry: Fix drive selector modal padding + change-type: patch + subject: Fix drive selector modal padding + body: null +- version: 1.5.88 + date: 2020-05-12T17:28:12.000Z + commits: + - hash: b23bfc2f6e588e851cc345f2bdaf9aef2c2bd37a + author: Alexis Svinartchouk + footers: + changelog-entry: Update uuid v3 -> v8 + change-type: patch + subject: Update uuid v3 -> v8 + body: null + - hash: 6db800d6d2a54964bd761c2d27aef3ae1dc83465 + author: Alexis Svinartchouk + footers: + changelog-entry: Update tmp 0.1.0 -> 0.2.1 + change-type: patch + subject: Update tmp 0.1.0 -> 0.2.1 + body: null + - hash: 82a0b8de0c914b3e467298df1f53da911558708f + author: Alexis Svinartchouk + footers: + changelog-entry: Update semver 5 -> 7 + change-type: patch + subject: Update semver 5 -> 7 + body: null + - hash: 50586cdb42cbe0debc4af83657806856e52ffdb1 + author: Alexis Svinartchouk + footers: + changelog-entry: Update debug 3 -> 4 + change-type: patch + subject: Update debug 3 -> 4 + body: null + - hash: ef5762864f1340e069f456fb070274d1e94caadf + author: Alexis Svinartchouk + footers: + changelog-entry: Update redux 3 -> 4 + change-type: patch + subject: Update redux 3 -> 4 + body: null + - hash: 917ff89d9dfdb676401d8eb447ec682d4713dcf5 + author: Alexis Svinartchouk + footers: + changelog-entry: Update electron-updater 4.0.6 -> 4.3.1 + change-type: patch + subject: Update electron-updater 4.0.6 -> 4.3.1 + body: null + - hash: bfb61338718fde79abd2a0b11ca588368f567ebb + author: Alexis Svinartchouk + footers: + changelog-entry: Update rendition 12 -> 14, styled-system and styled-components 4 -> 5 + change-type: patch + subject: Update rendition 12 -> 14, styled-system and styled-components 4 -> 5 + body: null + - hash: 483d7b6e587157153b63a0ab1a35d9b644003096 + author: Alexis Svinartchouk + footers: + changelog-entry: Update roboto-fontface 0.9.0 -> 0.10.0 + change-type: patch + subject: Update roboto-fontface 0.9.0 -> 0.10.0 + body: null +- version: 1.5.87 + date: 2020-05-12T11:45:32.000Z + commits: + - hash: 6e20b6034e2a79c0b96ef39b280cdad8d03f7b4d + author: Alexis Svinartchouk + footers: + changelog-entry: Update etcher-sdk to ^4.1.3 to fix issues with some bz2 files + change-type: patch + subject: Update etcher-sdk to ^4.1.3 to fix issues with some bz2 files + body: null +- version: 1.5.86 + date: 2020-05-06T15:46:41.000Z + commits: + - hash: 4a6a471345117d33f37f4397de26ed33c04a1120 + author: Alexis Svinartchouk + footers: + changelog-entry: Fix theme warnings + change-type: patch + subject: Fix theme warnings + body: null + - hash: 71e02ef8339071b95628e1dfa4f3e62519f29d91 + author: Alexis Svinartchouk + footers: + changelog-entry: Prefer balena-etcher to etcher-bin on Arch Linux + change-type: patch + subject: Prefer balena-etcher to etcher-bin on Arch Linux + body: null +- version: 1.5.84 + date: 2020-05-05T16:43:37.000Z + commits: + - hash: 4d3eb2887c20a7b9f74b94a690ae8abe52aa378a + author: Alexis Svinartchouk + footers: + changelog-entry: Fix notification icon path + change-type: patch + subject: Fix notification icon path + body: null + - hash: f84cde7d0403060f1bdffe176ec91a999768b566 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update etcher-sdk to ^4.0.1 + body: null + - hash: eb47f1227adfe3f142260c96a8e20ed6d28cd34a + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Fix libpango dependency name on debian + body: null + - hash: 5de4fe3d235172fe271e89c22ecb0cd45efd489b + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Don't depend on lsb for the rpm package + body: null + - hash: ebd37b9e2f6968bce0a41a05abac8cfe3ab161c4 + author: Rich Morin + footers: + change-type: patch + subject: Correct two nomenclature errors + body: >- + PC keyboards have "Alt" keys; Mac keyboards have "Opt" keys. + + Although it's possible to use a PC keyboard on a Mac, it's unusual. + + In any case, all of the macOS (not "Mac OS" for some years now) + documentation refers to the "Opt" key. + - hash: ea11f179542794294f773f503d83dad3a10cda56 + author: Tom + footers: + changelog-entry: Including Arch / Manjaro install instructions + change-type: patch + signed-off-by: Tom Carrio + subject: "docs: Including Arch / Manjaro install instructions" + body: null + - hash: 49491b9b8c34ac7bcdbc1b957f50ee676100084e + author: TheRealTachyon + footers: + change-type: patch + subject: Update to README.md + body: Just a simple addition of instructionsfor proper installation on OpenSUSE + Linux. + - hash: 7971a003cc2d86d31839407ea87d1e27e2eba653 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update copyright years + body: null +- version: 1.5.83 + date: 2020-04-30T12:04:53.000Z + commits: + - hash: ee62b9a4c762b793bde2d7472bfe5f5a61b4de30 + author: Alexis Svinartchouk + footers: + changelog-entry: Decompress images before flashing, remove trim setting, trim + ext partitions + change-type: patch + subject: Decompress images before flashing, remove trim setting, trim ext + partitions + body: null + - hash: 9bf58c89d4adadfe6d3d7c45a109542fa8e079e1 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update resin-lint -> @balena/lint + body: null + - hash: 745a2f18864b9235e168971f1f48c26c5f9a1e4a + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove no longer used settings and checks + body: null + - hash: 795b8614adc0287d73a2766ff493238bdbab91bc + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Send applicationSessionUuid and flashingWorkflowUuid by default in + logEvent + body: null + - hash: ba39ff433d550ec36e71e311ac9da14f40ce0a34 + author: Alexis Svinartchouk + subject: remove update lock + body: null + - hash: ffe281f25d1d7496a349f176cac043ebd5890e3d + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Simplify settings + body: null + - hash: 44fc429f64c54bb0c790dba48411b71f6af13bfe + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Factorize duplicated configUrl code + body: null + - hash: e62add68938fa6449943bf9822e0ca6f50e2d68f + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove some `any`s + body: null +- version: 1.5.82 + date: 2020-04-23T17:45:47.000Z + commits: + - hash: 8f39dbf6b120516106b8d44cec34828350b3adb2 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: none + changelog-entry: Add staging percentage for v1.5.81 + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Add staging percentage for v1.5.81 + body: null + - hash: dbe6fe442d00bcf7f501e8fd5c3c0354b7312777 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: none + changelog-entry: Trigger update for v1.5.81 + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Trigger update for v1.5.81 + body: null + - hash: 124e8af649c8596dfd7ee28da887d73c1a133d84 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Add flash from url workflow + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Add flash from url workflow + body: null + - hash: 94a0be3b057d9e0974dc78bbdd886a8849626407 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Refactor buttons style + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Refactor buttons style + body: null + - hash: ac2e973cb0f289e1367f1a14388d35da79c9a378 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Add generic error's message + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Add generic error's message + body: null + - hash: 39ed67d667cd75262c8d90216c9c5e855232f9fb + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Allow http/https only for Flash from URL + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Allow http/https only for Flash from URL + body: null +- version: 1.5.81 + date: 2020-04-16T16:28:59.000Z + commits: + - hash: 7eddb16f2f2899159a2216828b3c4e6084daa748 + author: Alexis Svinartchouk + footers: + changelog-entry: Update etcher-sdk to use direct IO + change-type: patch + subject: Update etcher-sdk to use direct IO + body: null + - hash: 63ad3739fd133adf44a378282145d4c92e5e3ea6 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Fix FlashResults component + body: null + - hash: d63df5a15639aab258abbddb6b5b01fcc3ccc4b4 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update bluebird + body: null + - hash: 82a3c37c16d73ad71417e3cd5ceab6081c415d13 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove no longer needed ts-ignore comments, fix typos + body: null + - hash: 52cf6375eb86be24cd3cc5901bab9c19d510b5ce + author: Wilson de Farias + footers: + changelog-entry: "docs: Update macOS drive recovery command" + change-type: patch + subject: Fixes the Command for macOS drive recovery + body: >- + Changes the documentation to update the disktutil command which didn't + fix my case, cause the boot partition was broken. + + This way it rewrites the drive into a FAT32 partition editable in + Unix/Windows. + - hash: b3f25c176b1bdb487d1a7bf111d7f170fe008842 + author: Lorenzo Alberto Maria Ambrosi + footers: + changelog-entry: Add average speed in flash results + change-type: patch + subject: Add average speed in flash results + body: null +- version: 1.5.80 + date: 2020-03-24T13:51:52.000Z + commits: + - hash: b4b099ecb19578d3d359bff6ce9e99265156e3f8 + author: Alexis Svinartchouk + footers: + changelog-entry: Fix sass files path for lint-sass + change-type: patch + subject: Fix sass files path for lint-sass + body: null + - hash: 21181f011fc5068bd7d4a610e5beb9b2cecddb8b + author: Alexis Svinartchouk + footers: + changelog-entry: Update electron to v7.1.14 + change-type: patch + subject: Update electron to v7.1.14 + body: null + - hash: 8b2f06442aa5ad8ed6a9a414ef7e7035e0b245d1 + author: Anthony Rouneau + footers: + change-type: patch + subject: Update README to use port 443 to get keys from keyserver.ubuntu.com + body: null + - hash: 4ee83d9da49667d5238394e5997211dfc77a980e + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Use zoomFactor to scale contents in fullscreen mode + subject: Use zoomFactor to scale contents in fullscreen mode + body: null + - hash: be729c87af68b0822b2c0fac04112bdc1b743fc5 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove useless if + body: null +- version: 1.5.79 + date: 2020-02-20T17:31:35.000Z + commits: + - hash: d8cb8f78154910f46b70f4b2537d57169b1a0b60 + author: Alois Klink + footers: + change-type: patch + changelog-entry: Fix error when launching from terminal when installed via apt. + fixes: https://github.com/balena-io/etcher/issues/3074 + subject: "fix(afterPack): error on launch from deb terminal" + body: |- + When installing balena-etcher via apt on Debian/Ubuntu, + the command `balena-etcher-electron` fails with the error: + line 3: /usr/bin/balena-etcher-electron.bin: No such file or directory + This is because the /usr/bin/balena-etcher-electron is a symlink + to /opt/balenaEtcher/balena-etcher-electron, but the script looks + for balena-etcher-electron.bin in the symlink directory, not the + actual script location directory. + This commit uses `$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")` to + find the real location of the balena-etcher-electron script without + symlink, so that balena-etcher-electron.bin is correctly found. + - hash: 0b20a1eeaa0ef02a0df65d90e66ba5a6f794edf6 + author: Alexis Svinartchouk + footers: + changelog-entry: Remove "Download the React DevTools for a better development + experience" message + change-type: patch + subject: Remove "Download the React DevTools for a better development + experience" message + body: null +- version: 1.5.78 + date: 2020-02-19T17:27:31.000Z + commits: + - hash: 55dcfc1a8503229e9be85599bba0d9c89d593052 + author: Alexis Svinartchouk + footers: + changelog-entry: Update drivelist to 8.0.10 to fix parsing lsblk --pairs + change-type: patch + subject: Update drivelist to 8.0.10 to fix parsing lsblk --pairs + body: null +- version: 1.5.77 + date: 2020-02-17T20:15:55.000Z + commits: + - hash: ed90f21188ad1a67bd645045b5425b45012e4290 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Running `make lint` will now fix the typescript files + body: null + - hash: 94d262263cbaebdbc5e70ceb0213fa13b7266fac + author: Alexis Svinartchouk + footers: + changelog-entry: The RGBLed module has been moved to a separate repository + change-type: patch + subject: The RGBLed module has been moved to a separate repository + body: null + - hash: 93d319275f1b139fce11ae8eccb82e636ad82708 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Fix imports in lib/start.ts + body: null + - hash: 42032964146effb7d66c043d79a41de41fb042e4 + author: Alexis Svinartchouk + footers: + changelog-entry: Fix error message not being shown on write error + change-type: patch + subject: Fix error message not being shown on write error + body: null + - hash: 7991d4076083c135a531b78a9a1ccec5137e333d + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Specify flashImageToDrive return type + body: null +- version: 1.5.76 + date: 2020-02-06T13:53:15.000Z + commits: + - hash: 45262583e6cbe41cf9f54c3f8a378c15c5ccd0af + author: Alexis Svinartchouk + footers: + changelog-entry: Update etcher-sdk to ^2.0.17 + change-type: patch + subject: Update etcher-sdk to ^2.0.17 + body: null + - hash: 07be84498545c1288054169ec2280ddb870a527c + author: Alexis Svinartchouk + footers: + changelog-entry: Fix image drop zone, remove react-dropzone dependency + change-type: patch + subject: Fix image drop zone, remove react-dropzone dependency + body: null + - hash: 6f58344e7bec8347182f9ac8d151931f48669c01 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Prefix temp permissions script name + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Prefix temp permissions script name + body: null +- version: 1.5.75 + date: 2020-02-05T12:35:11.000Z + commits: + - hash: fdec65e9bdf849b52030a9f1ea16e4654c5397e7 + author: Omar López + footers: + fixes: "#3056 #3057 #3058" + change-type: patch + changelog-entry: Initialize leds object map + subject: Initialize leds object map + body: null +- version: 1.5.74 + date: 2020-02-04T22:15:40.000Z + commits: + - hash: 9caa42d25703a98e624a3674bd803c9b28e29fba + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove unused settings.assign function + body: null + - hash: 6fcd9e15950b35130bacc42b1a8c811e4b920169 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove settings.getDefaults function + body: null + - hash: 571a3533fb839cb4386cf4a5f467cef776ffab6c + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Load settings before rendering the app + body: null + - hash: c09237f0c3e424344da3316abedc0a89fb2be237 + author: Alexis Svinartchouk + footers: + changelog-entry: Sort devices by device path on Linux + change-type: patch + subject: Sort devices by device path on Linux + body: null + - hash: 990dcc9d5a97baf8bc6f5ee2c8eadb97b60d31b5 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Fix loading driveBlacklist settings + body: null + - hash: f2705a611d63e048fea55d472db9c7a790721d8a + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update mocha and electron-mocha + body: null + - hash: af64579eb2fa8e78cb7e0ef9825f1c518e43fc51 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update resin-lint to ^3.2.0 + body: null + - hash: a22ea0b82b87ac90b8640c58d846f802e7ef0535 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update scripts submodule to prevent electon-mocha crashes on CI + body: null + - hash: 2aa6c83714e9557c86de3717bd3387dd0fb15e83 + author: Alexis Svinartchouk + footers: + changelog-entry: Update electron to 7.1.11 + chanege-type: patch + subject: Update electron to 7.1.11 + body: null + - hash: 81e80572d8f7769d20d2854cbe6923e3483b11ac + author: Alexis Svinartchouk + footers: + change-type: patch + subject: A warning about the selected image does not prevent the selection + body: This was introduced in 1.5.72 + - hash: c200a0c7ac19e97f65f689a42c53443ce8feaad7 + author: Alexis Svinartchouk + footers: + changelog-entry: Compress deb package with bzip instead of xz + change-type: patch + subject: Compress deb package with bzip instead of xz + body: "7za fails on ia32 CI with \"ERROR: Can't allocate required memory!\"" + - hash: cb8168de41ce3323e43b1e486e91936e7f129f41 + author: Alexis Svinartchouk + footers: + changelog-entry: Etcher pro leds feature + change-type: patch + subject: Etcher pro leds feature + body: null + - hash: 227bad9e997ac890338bc23fc4a9a7e906c5d6e7 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Keep leds sysfs files open + body: null +- version: 1.5.73 + date: 2020-01-29T13:54:19.000Z + commits: + - hash: 945cd7ff8e0b811607ef457edca4ec3ec1242e5e + author: Alexis Svinartchouk + footers: + changelog-entry: Update electron to v7.1.10 + change-type: patch + subject: Update electron to v7.1.10 + body: null + - hash: fc694b90b6a59d4761cf3329120cdedec6ea37a6 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Target es2018 + body: null + - hash: 2bdcae72090969040725a01b28e45f6a3282162d + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove unused BUILD_TEMPORARY_DIRECTORY scripts parameter + body: null +- version: 1.5.72 + date: 2020-01-17T15:36:41.000Z + commits: + - hash: 2c227d347567eab36ab9ed05b0a290d5b591d48d + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: none + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Trigger update for 1.5.71 + body: null + - hash: 05c2f5bebd2896875b5f4a7f4e4eac976c86da67 + author: Alexis Svinartchouk + footers: + changelog-entry: Remove no longer used closestUnit angular filter + change-type: patch + subject: Remove no longer used closestUnit angular filter + body: null + - hash: 65293ea5e4eec7f75c97d0f4027c2913dc73d821 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove no longer used ModalService + body: null + - hash: b71824c5e895969b1c8750d29ff085999819e10b + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove no longer used angular-if-state + body: null + - hash: 04e0b56dd5f87a7e53813f90fa19ea49d2f11608 + author: Alexis Svinartchouk + footers: + changelog-entry: Remove no longer used angular svg-icon component + change-type: patch + subject: Remove no longer used angular svg-icon component + body: null + - hash: 54fda697ce9dc5340dd182cecde9938c00fd4a8c + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove no longer used .section-footer-main css rules + body: null + - hash: c27be733a98de78e44ba8af2f9d488a440e0b101 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove no longer used angular-ui-bootstrap + body: null + - hash: e2f5775b07c0c3afe8c17119f81c7d556e7b103e + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove no longer needed angular specific utils.memoize + body: null + - hash: 2cd60af841c15eeb133622b83d07a036905d4ae9 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove no longer used angular flash-results component + body: null + - hash: 3a7d770f6d106f337bbb4c7d8af158abf430d76c + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove no longer used angular flash-another component + body: null + - hash: 315051c14c3b1a3be1d5ddc7949781d5537e2c4e + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove useless 'use strict' from a ts file + body: null + - hash: 146bfaa9debbe0f291bdcbaf126fc7e24f730eac + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove unused StateController.previousName + body: null + - hash: 26d0e463674dc51267e48f545ccde78d3e7c9e79 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Convert angular SafeWebview to typescript + body: null + - hash: d5eb679cf06754a3209bb0e3f672361a5dcd231f + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove remaining angular + body: null + - hash: 47fd12e7a441704f0546e1ae503b7649d10bff7d + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove html-angular-validate + body: null + - hash: f31cb49e2a4b496a27d498cc1cd3945712ae6e3f + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Don't use prop-types in drive selector + body: null + - hash: 233a2e640063c23b12f5dd4a43011e3926924198 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Convert menu.js to typescript + body: null + - hash: b4a60cfee2b7b9e8704daa9d88530d4fe9a15490 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove unused styled-components.js + body: null + - hash: 255fae3a9010e5aabb89b4557a2d29b922db0af7 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Convert middle-ellipsis.js to typescript + body: null + - hash: b266a727266427bd9879958c639136e67a17063c + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Convert window-network-drives.js to typescript + body: null + - hash: ddd1ff0101dd0005d671f8b8e8aca53c63dbf472 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Convert progress-status.js and window-progress.js to typescript + body: null + - hash: 13dfb090b5c09e3dd50402d49d801d573ab98686 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Convert open-external.js to typescript + body: null + - hash: c1e24406d9ecbbbc0e371cc6605396d7711e22a5 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Convert notification.js to typescript + body: null + - hash: 596b316d6532487ed82b896455ca6da9c1cc7b5d + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Convert update-lock.js to typescript + body: null + - hash: fadfadd9e9bcb5035d1825274c9034e402e96a0b + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Convert exception-reporter.js to typescript + body: null + - hash: a5825373e14004450feb5a42a2d47ea072ec0523 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Convert analytics.js to typescript + body: null + - hash: 0377faadd615be4804b1648b372c623a9470ae44 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Convert drive-scanner.js to typescript + body: null + - hash: f366a681592a062cee1c2537fcd6e10f518c34ed + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Convert theme.js to typescript + body: null + - hash: ef491e1e961451a33b05cb7be922a84e9db12a67 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove no longer used lib/gui/app/models/files.js and its tests + body: null + - hash: e50974a86a5ddf580d043f0d344cce431eb287e2 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Convert local-settings.js to typescript + body: null + - hash: 109d84302cc247dc75894f437e8cb313417684a7 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove no longer used storage.js and its tests + body: null +- version: 1.5.71 + date: 2020-01-14T16:15:05.000Z + commits: + - hash: b4fb82066b0746945f30bf3a72d78f319d7a578c + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Update resin-corvus to 2.0.5 + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Update resin-corvus to 2.0.5 + body: null + - hash: 171a5b17935b5fb0995fbe3f8f9c158b0a062a1b + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Update scripts submodule + body: null + - hash: 12b5536e22457c69c33073b4b937bfa1a235aae5 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Don't webpack package.json as analytics tokens are interted after + webpacking + body: null +- version: 1.5.70 + date: 2019-12-13T18:25:53.000Z + commits: + - hash: 5cd3c5fcc086d619a35ae6a4930412a60569e20c + author: Lucian + footers: + change-type: patch + changelog-entry: Use React instead of Angular for image selection + signed-off-by: Lucian + subject: Refactor image-selection + body: null + - hash: 1d15d582d99fbffb870dd564673da73a70a59088 + author: Stevche Radevski + footers: + changelog-entry: "chore: move flash step to React" + change-type: patch + signed-off-by: Stevche Radevski + subject: "chore: move flash step to React" + body: null + - hash: abfc6be84d971670fd2914432caaa42263cfe260 + author: Thodoris Greasidis + footers: + change-type: patch + changelog-entry: Convert the drive selection step to React + signed-off-by: Thodoris Greasidis + subject: Convert the drive selection step to React + body: null + - hash: 8177e980147e7154319edb30b0e3304e3d13f6bd + author: Thodoris Greasidis + footers: + change-type: patch + signed-off-by: Thodoris Greasidis + subject: Refactor the DriveSelector to use async-await + body: null + - hash: 641dde81e51c2c95edd212dae8ef242a8c27f380 + author: Lucian + footers: + change-type: patch + changelog-entry: Use React instead of Angular for image selection + signed-off-by: Lucian + subject: Refactor image-selection + body: null + - hash: 00536cba3aea1a59c2ce595d9b1fabaade0ecff9 + author: Lucian + subject: Refactor Warning modal in image selection + body: null + - hash: 21d9d31a27939eb6997faa78b510a6c7e375ebed + author: Stevche Radevski + footers: + change-type: patch + signed-off-by: Stevche Radevski + subject: Use rendition modal for warning and errors when flashing + body: null + - hash: 996c2b55a426987bbea1821f24754cea31af3bd1 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Run make sass + body: null + - hash: b6fb44d6a51aac748479c2a1d7a80255f35cce1b + author: Lucian + footers: + signed-off-by: Lucian + subject: Fix bug where images can't be reselected + body: null + - hash: a7a7f83e3e08b95c16a1b4783c5692aa9962b440 + author: Lucian + footers: + signed-off-by: Lucian + subject: Fix link hover color + body: null + - hash: 177f10f76d3846d8c0c7eca35582e938b728e370 + author: Lucian + footers: + signed-off-by: Lucian + subject: Refactor tooltip modal to use react + body: null + - hash: fc597abbc98fa498108fe7688892a66a620d42e9 + author: Lucian + footers: + signed-off-by: Lucian + subject: Add sourcemap and elevate theme provider + body: null + - hash: ffb26ba67f063a87b922bf5905029547672c7299 + author: Lucian + footers: + signed-off-by: Lucian + subject: Remove unused methods from drive selector component + body: null + - hash: 330405ae42575aec428c051d69915b676873988e + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove tooltip-modal scss import + body: null + - hash: 07fc7af911bbc647e0aa56446989b7f51da6c337 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove experimental file picker + body: null + - hash: 28b51a9b460df0c2a8fb37b11859065517c9a5b9 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove unused imports in main.js + body: null + - hash: 84fe5004a9fbe4cd73d6c3d8e556de6ba4250f77 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove broken settings shortcut from menu + body: null + - hash: 8e47829905ec4b707f99bbdff705a23b398835df + author: Stevche Radevski + footers: + change-type: patch + signed-off-by: Stevche Radevski + subject: Move the main controller to React + body: null + - hash: 4e1f0719519f6e87cd7ca81a98b61c479a78397a + author: Stevche Radevski + footers: + change-type: patch + signed-off-by: Stevche Radevski + subject: Change Flash and Driveselector extension to .tsx + body: This is so the git history is preserved for the file + - hash: 388852d6b783c428df18a8f4ce44a512ed57e858 + author: Stevche Radevski + footers: + change-type: patch + signed-off-by: Stevche Radevski + subject: Move a couple of files to typescript and remove unnecessary $timeout + body: null + - hash: 9f4e0ce92018d68911a208392bf53dbb476857c6 + author: Stevche Radevski + footers: + change-type: patch + signed-off-by: Stevche Radevski + subject: Add husky and lint-staged to run linting on commit + body: null + - hash: c9c9c50d6c35485f965712ad0599fbe7c5d2a25c + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Rework finish page with React + body: null + - hash: 68d9542816fdfe7be49f3e8404ab970b96b9535b + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Convert FlashAnother & FlashResults to typescript + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Convert FlashAnother & FlashResults to typescript + body: null + - hash: 84e45caa6c3c4699612324b0ae64cdd76951664e + author: Alexis Svinartchouk + footers: + change-type: patch + changelog-entry: Rework lib/gui/app/styled-components to typescript + subject: Rework lib/gui/app/styled-components to typescript + body: null + - hash: 992b8a6fb6d3d1bfa4f0fdd85f3cc5d03c75a58f + author: Stevche Radevski + footers: + change-type: patch + signed-off-by: Stevche Radevski + subject: Fix layout when flashing + body: null + - hash: 2f0ce3ee375967af9201502b9192445957b04be0 + author: Alexis Svinartchouk + subject: Only run prettier on ts and tsx files + body: null + - hash: fe230e7d3094a5f8e761108c3b1550dbdd125d9c + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Rename resin -> balena + body: null + - hash: 67eb593164065b04124ae5ea738f272185c19a0f + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove manifest-bind + body: null + - hash: 3bdac794b31a2b8a0efce8a8ae04f2fa1f3d3c14 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: React header + body: null + - hash: 4c931278b8dbf1e80e5680eca93687635e8bdce9 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove angular os-open-external directive + body: null +- version: 1.5.69 + date: 2019-12-10T11:33:29.000Z + commits: + - hash: 1408dd48a1c2f4c551f3d4dd39cf7ec4c09f17b3 + author: Alexis Svinartchouk + footers: + changelog-entry: Don't add --no-sandbox when ELECTRON_RUN_AS_NODE true + change-type: patch + subject: Don't add --no-sandbox when ELECTRON_RUN_AS_NODE true + body: null +- version: 1.5.68 + date: 2019-12-09T09:41:54.000Z + commits: + - hash: 7d284a7e189f2f545d8cb169122be0afe977fa5d + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Add version in settings modal + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Add version in settings modal + body: null +- version: 1.5.67 + date: 2019-12-06T11:48:18.000Z + commits: + - hash: 2ef38fe06ddd86a54ca00c6b68cf277d3b96f182 + author: Alexis Svinartchouk + footers: + changelog-entry: Fix elevation on macos in development + change-type: patch + subject: Fix elevation on macos in development + body: null +- version: 1.5.66 + date: 2019-12-03T16:28:10.000Z + commits: + - hash: 1626c01ff4bc611a11df65d41a2222bb14266f0b + author: Alexis Svinartchouk + footers: + change-type: patch + changelog-entry: Update electron to 6.0.10 + subject: Update electron to 6.0.10 + body: null + - hash: d071bf8ade4e49cf65328af7e1547e890ca0c09f + author: Alexis Svinartchouk + footers: + changelog-entry: Update electron-mocha to ^8.1.2, remove acorn + change-type: patch + subject: Update electron-mocha to ^8.1.2, remove acorn + body: null + - hash: 9488468b67256f2eaf365300efc06cdbbc12b58c + author: Alexis Svinartchouk + footers: + changelog-entry: Remove node-pre-gyp patch that is no longer needed with electron 6 + change-type: patch + subject: Remove node-pre-gyp patch that is no longer needed with electron 6 + body: null + - hash: caf09e749881a2665051f2d339a286495b47e947 + author: Alexis Svinartchouk + footers: + changelog-entry: Remove no longer needed xml2js + change-type: patch + subject: Remove no longer needed xml2js + body: null + - hash: 2c2057b5cbb390e43b8e6b9d4a22d34cf0f1a528 + author: Alexis Svinartchouk + footers: + changelog-entry: Update mocha, remove nock + change-type: patch + subject: Update mocha, remove nock + body: null + - hash: 07a6e409173b919f12f85fcc86823db44df3b8cd + author: Alexis Svinartchouk + footers: + changelog-entry: Remove no longer needed pkg dev dependency + change-type: patch + subject: Remove no longer needed pkg dev dependency + body: null + - hash: 1be1a2b8f7df4caf1b53795099f7e2b5c4b3c133 + author: Alexis Svinartchouk + footers: + changelog-entry: Require angular-mocks only when needed + change-type: patch + subject: Require angular-mocks only when needed + body: null + - hash: 1098f8cb1e7e209cc29cb7b3953dacf9fa671bf6 + author: Alexis Svinartchouk + footers: + changelog-entry: Use the same entrypoint for etcher and the child writer + change-type: patch + subject: Use the same entrypoint for etcher and the child writer + body: null + - hash: 994d311ed37afe6ff22ba810602a30426215066c + author: Alexis Svinartchouk + footers: + changelog-entry: Update nan to ^2.14 + change-type: patch + subject: Update nan to ^2.14 + body: null + - hash: cf6863b2c6d5d3e115222bbaa0ae81911e1d0bb5 + author: Alexis Svinartchouk + footers: + changelog-entry: Update dependencies, get node-usb from npm + change-type: patch + subject: Update dependencies, get node-usb from npm + body: null + - hash: cddd068887ac48cf4a9856c4b3a671092d3cb913 + author: Alexis Svinartchouk + footers: + changelog-entry: Update spectron to ^8 + change-type: patch + subject: Update spectron to ^8 + body: null + - hash: 707c20513ea27cd67b0a6c44a94759fa9c594b39 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Simplify electron-builder files config + body: null + - hash: 4f36b00ec366a6d753f646bedbb60bf61f5a691b + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Simplify webpack config + body: null + - hash: 5b22fcc2f5a74839aac5151e7edb8d99ba06b8eb + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove unused script + body: null + - hash: 2f828b1d39c8c91ec69b991de7b329c8092bdd9e + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Wrapper script for linux to add --no-sandbox when running as root + body: null + - hash: 26e827e4dcae0ee3083016b5f8b7f37b9145f955 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update electron to 6.1.4 + body: null + - hash: 18fb9c9de36d15dfaedd20d06c08294994b758d1 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Package dll files (needed for lzma_native on windows) + body: null + - hash: 59230a0f9e54b4885e8f6b4b100f5e7a9acd7e4f + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Fix windows elevation module import + body: null + - hash: bcbbb64042b5d37f911be5c879503a6b1b3364d7 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update dependencies after rebase + body: null + - hash: 062723bf15d5d4e17add01360a9de6c02d10a8c2 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Fix typing in settings.tsx + body: null + - hash: 220b7f6d53163db224b373d6d064593c2a2b60fa + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove usage of deprecated componentWillReceiveProps + body: null +- version: 1.5.65 + date: 2019-12-03T10:06:44.000Z + commits: + - hash: 4c0a079d1e4abcc054ddb74b3a34a39a6d5085d1 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Refactor settings page into modal + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Refactor settings page into modal + body: null + - hash: 3b0794606530f201bab6d0e0aec15d6f420b006a + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Convert settings modal to typescript + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Convert settings modal to typescript + body: null +- version: 1.5.64 + date: 2019-11-27T14:09:44.000Z + commits: + - hash: 572f7d826a4efb96e893e955d42b32c0d5582024 + author: Alexis Svinartchouk + footers: + change-type: patch + changelog-entry: Use bash instead of sh for running the elevated process on + Linux and Mac + subject: Use bash instead of sh for running the elevated process on Linux and Mac + body: null +- version: 1.5.63 + date: 2019-11-08T13:00:14.000Z + commits: + - hash: 88b7665b7fdcf5b716125fc823834f94fd869e20 + author: Dimitrios Lytras + footers: + changelog-entry: Introduce an FAQ file + change-type: patch + signed-off-by: Dimitrios Lytras dnlytras@gmail.com + subject: "docs: Introduce an FAQ file" + body: Much needed file in order to generate the FAQ section for the website + using Landr +- version: 1.5.62 + date: 2019-11-06T17:35:43.000Z + commits: + - hash: c0d1899ad36284ba9b5c03385454115ad4db4589 + author: Alexis Svinartchouk + footers: + changelog-entry: Update drivelist to 8.0.9 + change-type: patch + subject: Update drivelist to 8.0.9 + body: null +- version: 1.5.61 + date: 2019-11-06T01:55:47.000Z + commits: + - hash: c4944f31d651fd8e40c8edcd54d7d6960b14fc06 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Notarize app on macOS + subject: Notarize app on macOS + body: null + - hash: 64a28f891fa8a9da47581bb67540a07caac1404b + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Don't pack files in an asar archive on macOS + body: null + - hash: 9b82891abb86fc27c3df531fa6e1086192de4f03 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Use sudo instead of sudo-prompt on macOS >= Catalina + body: null + - hash: 1ee2eb05ebc9d3c77048f0a688af8351a2b62cd8 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update electron-builder to ^22 + body: null + - hash: 1b8380c5dc3fff14057a44ed442e317979274636 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update scripts repo as electron-builder's build command was renamed + electron-builder + body: null + - hash: d494cee0da8e985601b62a537c1ff79059691150 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Don't spell check scripts + body: null + - hash: f372fba1fd346d86d6c6995bd5101d5faeb6a55f + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Don't use electron-is-running-in-asar, fix AppImage builds + body: null +- version: 1.5.60 + date: 2019-10-18T11:31:04.000Z + commits: + - hash: 831e7af9ed338376a220b7749f83ecd88602e052 + author: Matthew McGinn + footers: + changelog-entry: Upgrade ext2fs to 1.0.30 + change-type: patch + signed-off-by: Matthew McGinn + subject: "ext2fs: upgrade ext2fs to 1.0.30" + body: null +- version: 1.5.59 + date: 2019-10-14T13:34:13.000Z + commits: + - hash: 5151d751a3d77918aeaa1cfb73d16a9e1d4ceda3 + author: Roman Mazur + footers: + changelog-entry: Catch console log messages from SafeWebView + change-type: patch + signed-off-by: Roman Mazur + subject: Catch console log messages from SafeWebView + body: |- + This simplifies debugging of the content loaded by Etcher, + including analysis of loaded analytics libraries. +- version: 1.5.58 + date: 2019-10-10T10:06:54.000Z + commits: + - hash: dda2f6eb7016851ef6e601769ba5e29ec0646818 + author: Dimitrios Lytras + footers: + changelog-entry: Remove leftover GH-pages configuration file + change-type: patch + signed-off-by: Dimitrios Lytras dnlytras@gmail.com + subject: "docs: Remove leftover GH-pages configuration file" + body: null +- version: 1.5.57 + date: 2019-09-17T13:23:43.000Z + commits: + - hash: 93ea4efb3321302fa0efd5ae8c435e1b3906d5c8 + author: Alexis Svinartchouk + footers: + change-type: patch + changelog-entry: Fix entrypoint when options are passed to electron + subject: Fix entrypoint when options are passed to electron + body: null +- version: 1.5.56 + date: 2019-08-20T14:41:51.000Z + commits: + - hash: 02bd8ed4594325838c8f2d3124c29fbb5f272afc + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Fix windows portable download + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Fix windows portable download + body: null +- version: 1.5.55 + date: 2019-08-20T11:21:43.000Z + commits: + - hash: f6c01722572e52140558040694ebbce10c2ec560 + author: Alexis Svinartchouk + footers: + change-type: patch + changelog-entry: Update etcher-sdk to ^2.0.13 + subject: Update etcher-sdk to ^2.0.13 + body: null +- version: 1.5.54 + date: 2019-08-19T11:06:40.000Z + commits: + - hash: 8c2c4e233af0fbda2dd85266f7f7ce7fa15c98ba + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Fix auto-updater check for updates + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Fix auto-updater check for updates + body: null +- version: 1.5.53 + date: 2019-08-06T12:43:26.000Z + commits: + - hash: 8df5d972fc219fbe1ab567eaeb46e2c7d5be16e6 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Allow typescript files + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Allow typescript files + body: null + - hash: 865ea0ddd2a6f28acd1988645a97a2941e66e5c6 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: none + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Trigger update for 1.5.52 + body: null +- version: 1.5.52 + date: 2019-07-23T12:56:48.000Z + commits: + - hash: b5d04a2031a766a203ce1998a1e401a6d0a8b963 + author: Alexis Svinartchouk + footers: + changelog-entry: Don't use wmic's ProviderName if it's empty + change-type: patch + subject: Don't use wmic's ProviderName if it's empty + body: null +- version: 1.5.51 + date: 2019-06-28T13:02:52.000Z + commits: + - hash: b99b0d4bf86e9eb72d321ec64da3eee1811effbb + author: Alexis Svinartchouk + footers: + change-type: patch + changelog-entry: Update sudo-prompt to ^9.0.0 + subject: Update sudo-prompt to ^9.0.0 + body: null +- version: 1.5.50 + date: 2019-06-14T13:41:30.000Z + commits: + - hash: da548f59d18c081279eb5009bc8c979172c35045 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Replace promise chains with async/await in child-writer + body: null + - hash: 52a325881402001f148902db0c36075cb74aae5c + author: Alexis Svinartchouk + footers: + changelog-entry: Option for trimming ext partitions on raw images + change-type: patch + subject: Option for trimming ext partitions on raw images + body: null +- version: 1.5.49 + date: 2019-06-13T16:39:31.000Z + commits: + - hash: c5dc869c032f76aec005bf2d7c4f94c12fd586c2 + author: Alexis Svinartchouk + footers: + change-type: patch + changelog-entry: Make window size configurable + subject: Make window size configurable + body: null +- version: 1.5.48 + date: 2019-06-13T14:26:49.000Z + commits: + - hash: ef4d2fcc7287db74c483691d563658de7dffbb3a + author: Alexis Svinartchouk + footers: + changelog-entry: Don't use sudo-prompt when already elevated + change-type: patch + subject: Don't use sudo-prompt when already elevated + body: null +- version: 1.5.47 + date: 2019-06-12T13:28:09.000Z + commits: + - hash: 3236d6b934f5e23b089145482f512564c4f45a4b + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Upgrade rendition to v8.7.2 + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Upgrade rendition to v8.7.2 + body: null + - hash: 33df23fc8cd02a1f74cb3fc232e2ad16345a8d6d + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Upgrade styled-system to v4.1.0 + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Upgrade styled-system to v4.1.0 + body: null + - hash: 543ba51d3cdc4d6e17dfab106c85980f92ffabd1 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Use rendition theme property for step buttons + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Add first rendition theme configs + body: null + - hash: 17f83135c57a6ff283e70f19b8477bcb11422fc2 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Rework drive-selector with react + rendition + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Rework drive-selector with react + rendition + body: null +- version: 1.5.46 + date: 2019-06-09T14:07:38.000Z + commits: + - hash: 6dae2a604ff25281939bd8962bb019adf430e0b3 + author: Alexis Svinartchouk + footers: + change-type: patch + changelog-entry: Update ext2fs to 1.0.29 + subject: Update ext2fs to 1.0.29 + body: null +- version: 1.5.45 + date: 2019-06-04T09:56:25.000Z + commits: + - hash: d382f030f0ad0ddc2b64104b42ae0177d6ddf8c5 + author: Alexis Svinartchouk + footers: + change-type: patch + changelog-entry: Empty commit to trigger build + subject: Empty commit to trigger build + body: null +- version: 1.5.44 + date: 2019-06-03T18:14:46.000Z + commits: + - hash: 6d8346b13a9fb9e99c4f65af22b1baf851f7e66f + author: Alexis Svinartchouk + footers: + change-type: patch + changelog-entry: Fix elevation on windows when the path contains "&" or "'" + subject: Fix elevation on windows when the path contains "&" or "'" + body: null +- version: 1.5.43 + date: 2019-05-28T18:57:07.000Z + commits: + - hash: de5bee29efa673b8237ccef45ec9805cfa9cd361 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Revert "Include sass in webpack configs" + subject: Revert "Include sass in webpack configs" + body: This reverts commit 156c25cea19bc4a382bb7ce672304546ce476d37. +- version: 1.5.42 + date: 2019-05-28T14:38:56.000Z + commits: + - hash: 156c25cea19bc4a382bb7ce672304546ce476d37 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Include sass in webpack configs + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Include sass in webpack configs + body: null +- version: 1.5.41 + date: 2019-05-27T13:57:19.000Z + commits: + - hash: 3fccd52884e82c4e7b57872ca0c3043cf13fc15c + author: Mateusz Hajder + footers: + change-type: patch + changelog-entry: waffle.io removal and adding a link to the license + subject: waffle.io removal and adding a link to the license + body: null +- version: 1.5.40 + date: 2019-05-27T10:14:10.000Z + commits: + - hash: f815e8511fafabbe1d73b8bbef4d7a8b57c8049d + author: Alexis Svinartchouk + footers: + changelog-entry: windows installer and portable version support both ia32 and x64 + change-type: patch + subject: Build packages that support both ia32 and x64 on windows + body: null + - hash: bed6643437d4005f0e87966dd79099b4cfc18e3f + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove some unused files from the packages + body: null +- version: 1.5.39 + date: 2019-05-14T10:25:05.000Z + commits: + - hash: aa527350067e3dc7460f8b5f893a755d4b8f8380 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Add clean-shrinkwrap script to postshrinkwrap step + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Add clean-shrinkwrap script to postshrinkwrap step + body: null + - hash: ffb89c7e5bebaa2bc3539560ad45a0de046b45eb + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Update scripts submodule to v1.5.2 + body: null +- version: 1.5.38 + date: 2019-05-13T22:45:00.000Z + commits: + - hash: 0b5017f992e7fb94677772462884945d94260c6b + author: Carlo Maria Curinga + footers: + change-type: patch + changelog-entry: Add mention to usbboot compatibility + signed-off-by: Carlo Maria Curinga carlo@balena.io + subject: add mention to usbboot devices support + body: null +- version: 1.5.37 + date: 2019-05-13T17:51:01.000Z + commits: + - hash: 3402c9f601216474a4acd729fac465a98265c1ac + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Bump react dependency to v16.8.5 + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Bump react to v16.8.5 + body: null +- version: 1.5.36 + date: 2019-05-13T12:32:52.000Z + commits: + - hash: 50a34e2f4c748da4deb2a1184304761ddf209f32 + author: Alexis Svinartchouk + footers: + changelog-entry: Update etcher-sdk to ^2.0.9 + change-type: patch + subject: Update etcher-sdk to ^2.0.9 + body: null +- version: 1.5.35 + date: 2019-05-10T17:27:32.000Z + commits: + - hash: 9cb27a616ac9d9ccb93455677d0f52e36dae46d1 + author: Alexis Svinartchouk + footers: + changelog-entry: Downgrade electron 4.1.5 -> 3.1.9 + change-type: patch + subject: Downgrade electron 4.1.5 -> 3.1.9 + body: null +- version: 1.5.34 + date: 2019-05-10T10:19:18.000Z + commits: + - hash: e80106d8f8e68149949055cb3e32a891b93c79a1 + author: Alexis Svinartchouk + footers: + changelog-entry: "win32: fix running diskpart when the tmp file path contains spaces" + change-type: patch + subject: Update etcher-sdk to ^2.0.7 + body: null + - hash: 6386f852586a5eb450b942dc43f41f316da2e99e + author: Alexis Svinartchouk + footers: + changelog-entry: Use https url for fetching config, avoid redirection + change-type: patch + subject: Use https url for fetching config, avoid redirection + body: null +- version: 1.5.33 + date: 2019-04-30T19:14:28.000Z + commits: + - hash: 9d78da941ba168325c7a72e658bd6bf8d6a8f234 + author: Alexis Svinartchouk + footers: + changelog-entry: Fix gzipped files verification percentage and dmg verification. + change-type: patch + subject: Update etcher-sdk to ^2.0.5 + body: null +- version: 1.5.32 + date: 2019-04-30T16:03:22.000Z + commits: + - hash: 792fab20e68a3428dbf1c6d1052c9ebd472b05f6 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Export NPM_VERSION variable in Makefile + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Export NPM_VERSION variable in Makefile + body: null + - hash: 8a2db8bced4781f992c64b62adcc28dfe11a1434 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Add CODEOWNERS file to repository + body: null +- version: 1.5.31 + date: 2019-04-30T10:52:46.000Z + commits: + - hash: 88f543dd2583bcbf50e2f569bd19edbbd300fc24 + author: Alexis Svinartchouk + footers: + changelog-entry: Update electron to 4.1.5 + change-type: patch + subject: Update electron to 4.1.5 + body: null + - hash: 1fcde5a17c1efbd7d5a23bcab4b3fa1a8a36347e + author: Alexis Svinartchouk + footers: + changelog-entry: Update etcher-sdk to ^2.0.3 + change-type: patch + subject: Update etcher-sdk to ^2.0.3 + body: null +- version: 1.5.30 + date: 2019-04-24T11:58:38.000Z + commits: + - hash: 63c047009f6d3b8d20ef291bc4ce036c48aaf03b + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove useless returns and unused parameter + body: null + - hash: 1f7e4c886b4f85579a53f96f3039ec38097d673d + author: Alexis Svinartchouk + footers: + changelog-entry: Don't show a dialog when the write fails. + subject: Don't show a dialog when the write fails. + body: There is already an error modal and the error detail will be shown in the + console. +- version: 1.5.29 + date: 2019-04-22T07:08:09.000Z + commits: + - hash: 3d3b4f4a46875c1e411b45156c8965d20214677d + author: Giovanni Garufi + footers: + change-type: patch + changelog-entry: Add support for auto-updating feature + signed-off-by: Giovanni Garufi + subject: Add electron autoupdater + body: null + - hash: 7e2c62c520e8264fa3886c7bdd1dbe52f47c95a8 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Fix mixpanel events sampling rate + body: null + - hash: 428c7774029a8fdc9905ecabb109cfd57887328c + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Fix npm-shrinkwrap.json + body: null +- version: 1.5.28 + date: 2019-04-19T11:44:53.000Z + commits: + - hash: 2c835437e9f2c9e688bb713af64c7cd083c469a8 + author: Alexis Svinartchouk + footers: + changelog-entry: Update etcher-sdk to ^2.0.1 + change-type: patch + subject: Update etcher-sdk to ^2.0.1 + body: null + - hash: d95401e614ba96cd2d2173e5564508466d75edf9 + author: Alexis Svinartchouk + footers: + changelog-entry: Update electron-builder to ^20.40.2 + change-type: patch + subject: Update electron-builder to ^20.40.2 + body: null +- version: 1.5.27 + date: 2019-04-16T14:28:39.000Z + commits: + - hash: 11def54adb917b72da61b7a1a0fe5eab8be9d7f2 + author: Alexis Svinartchouk + footers: + changelog-entry: "(Windows): Fix reading images from network drives when the tmp + dir has spaces" + change-type: patch + subject: Fix reading images from network drives on windows when the tmp dir has + spaces + body: null +- version: 1.5.26 + date: 2019-04-12T17:42:13.000Z + commits: + - hash: 6e72c0719050d980f56ccd8a0e158f586ef1ffd8 + author: Alexis Svinartchouk + footers: + changelog-entry: "(Windows): Fix reading images from network drives containing + non ascii characters" + change-type: patch + subject: Fix reading images from network drives containing non ascii characters + body: null +- version: 1.5.25 + date: 2019-04-10T11:24:58.000Z + commits: + - hash: 6a9b7395419e2cf978dc6e02fef4e8265a225c7f + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: New parameter in webview for opt-out analytics + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: New parameter in webview for opt-out analytics + body: null +- version: 1.5.24 + date: 2019-04-08T13:25:40.000Z + commits: + - hash: fc1c1b402b96cbb07be8a8136d735608a89fccf4 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Add sample property to Mixpanel events + body: null + - hash: 24a83260ca3494814ad880de565996af2d938417 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Update building scripts to latest master + body: null + - hash: 3e236996c807d7ba0d35f76443fdedd9063e1ba4 + author: Alexis Svinartchouk + footers: + changelog-entry: Update resin-corvus to ^2.0.3 + change-type: patch + subject: Update resin-corvus to ^2.0.3 + body: null +- version: 1.5.23 + date: 2019-04-03T10:17:18.000Z + commits: + - hash: 15fc8ab2e798cf632a8cf5982c37f7faa247e49d + author: Giovanni Garufi + footers: + change-type: patch + changelog-entry: Configure versionbot to publish repo metadata to github pages + signed-off-by: Giovanni Garufi + subject: Set publishMetadata in repo.yml + body: |- + This will cause VB to publish metadata about the repo to its gh-pages + branch on merge +- version: 1.5.22 + date: 2019-04-02T16:51:38.000Z + commits: + - hash: db771bc2cc2b262a6bd7f35b7d93d8456ad6ee06 + author: Alexis Svinartchouk + footers: + changelog-entry: "(Windows): Use full path to wmic as some systems don't have it + in their PATH" + change-type: patch + subject: Use full path to wmic as some systems don't have it in their PATH + body: null +- version: 1.5.21 + date: 2019-04-02T14:42:01.000Z + commits: + - hash: 40de7f5d5462239de3d2e8df9005b06881c7d646 + author: Alexis Svinartchouk + footers: + changelog-entry: Fix error when config.analytics was undefined + change-type: patch + subject: Fix error when config.analytics was undefined + body: null +- version: 1.5.20 + date: 2019-04-01T16:00:28.000Z + commits: + - hash: ec015da7959ce321bb29306e240d7516d57862e0 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: 'Avoid "Invalid state percentage: null" errors' + body: null + - hash: 34c98d1dcde836f58b4dd2e489c9775cf32729b5 + author: Alexis Svinartchouk + footers: + changelog-entry: 'Avoid "Error: There is already a flash in progress" errors' + change-type: patch + subject: Use async/await in flash.js + body: 'Avoid a rare race condition leading to "Error: There is already a flash + in progress" messages' + - hash: cafaa9ff2255815bcf6cba9d03ca5198541df5e3 + author: Giovanni Garufi + footers: + change-type: patch + changelog-entry: Reformat changelog + signed-off-by: Giovanni Garufi + subject: Delete versionist.conf + body: |- + Versionist will now look at repo.yml and inject the versionist config + corresponding to the type + - hash: 164fd8f02226b6ebf28c6d73a4690f19ca0c6f50 + author: Alexis Svinartchouk + footers: + changelog-entry: Don't try to flash when no device is selected + change-type: patch + subject: Don't try to flash when no device is selected + body: null + - hash: b61109a269ad12946c62e913becee94946b09081 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Fix reading images from network drives on windows + body: null +- version: 1.5.19 + date: 2019-03-28T14:47:03.000Z + commits: + - hash: bceb7c77d1ab9a80a276c0967f00d838b6aa774e + author: Alexis Svinartchouk + footers: + changelog-entry: Better reporting of unhandled rejections to sentry + change-type: patch + subject: Better reporting of unhandled rejections to sentry + body: null + - hash: 39573ada545bbf7798e691249f6f7ea498c29dd4 + author: Alexis Svinartchouk + footers: + changelog-entry: Update resin-corvus to ^2.0.2 + change-type: patch + subject: Update resin-corvus to ^2.0.2 + body: null +- version: 1.5.18 + date: 2019-03-26T23:40:23.000Z + commits: + - hash: 03b1a2dcff69de681bdc3c405b8c73496f888993 + author: Giovanni Garufi + footers: + change-type: patch + changelog-entry: Update build scripts + signed-off-by: Giovanni Garufi + subject: Update scripts + body: null +- version: 1.5.17 + date: 2019-03-26T08:45:29.000Z + commits: + - hash: d078055e4059c4a3a64b225a4ceda6f287f40f29 + author: Giovanni Garufi + footers: + change-type: patch + signed-off-by: Giovanni Garufi + changelog-entry: Automatically publish github release from CI + subject: "Set publish: github in repo.yml" + body: null +- version: 1.5.16 + date: 2019-03-25T16:31:06.000Z + commits: + - hash: 52caae8f059e9bb8c5b61e4982f4e4b6ee578d43 + author: Giovanni Garufi + footers: + change-type: patch + signed-off-by: Giovanni Garufi + changelog-entry: Add repo.yml for CI + subject: Add repo.yml + body: null + - hash: 15f87edc96b57a4cc7e15ecde91d78be399e1d21 + author: Giovanni Garufi + subject: Update .gitattributes to always use LF for EOL in json files + body: null + - hash: 195f07c09fdfae4b617c3023ebd9bb49f209f7c7 + author: Giovanni Garufi + footers: + change-type: patch + signed-off-by: Giovanni Garufi + subject: Update scripts + body: null +- version: 1.5.15 + date: 2019-03-21T00:19:15.000Z + commits: + - hash: 0c2eb1caaba7046aaabe92b18a2774e05bc20e4f + author: Juan Cruz Viotti + footers: + change-type: patch + changelog-entry: Show the correct logo on usbboot devices on Ubuntu + signed-off-by: Juan Cruz Viotti + subject: "etcher-sdk: Upgrade to 1.3.11" + body: null +- version: 1.5.14 + date: 2019-03-20T17:09:35.000Z + commits: + - hash: 33fb79e0de5968d20b0f48cd2c42def39569257f + author: Alexis Svinartchouk + footers: + changelog-entry: Update etcher-sdk to ^1.3.10 + change-type: patch + subject: Update etcher-sdk to ^1.3.10 + body: null + - hash: fc9282fff7625d814014fc14a4a91eb223106f37 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove versionist from dev dependencies + body: null +- version: 1.5.13 + date: 2019-03-18T18:02:31.000Z + commits: + - hash: 818b4666875826a3f3c98e72bfe19844bd87ba9d + author: Giovanni Garufi + footers: + change-type: patch + signed-off-by: Giovanni Garufi + changelog-entry: Update build scripts + subject: Update scripts + body: null +- version: 1.5.12 + date: 2019-03-15T17:12:02.000Z + commits: + - hash: 3cfa6988abee5eae209e9a5252e638ed8f3accc0 + author: Lorenzo Alberto Maria Ambrosi + footers: + changelog-entry: Update build scripts + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Update build scripts + body: null + - hash: 7d715fdca07337ba0b502a5abe40df96da11dfa4 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Disable node gyp rebuild while running electron-builder + body: null +- version: 1.5.11 + date: 2019-03-12T18:00:52.000Z + commits: + - hash: 091bddbad88d7b5f5d625ae89dbf0206fac37843 + author: Alexis Svinartchouk + footers: + changelog-entry: Remove no longer used travis and appveyor configs + change-type: patch + subject: Remove no longer used travis and appveyor configs + body: null + - hash: 94e91723f4c47cf76797db906ffb33eb7071d2ff + author: David Lozano Jarque + footers: + changelog-entry: Fixed broken Hombrew cask link for etcher + change-type: patch + subject: Update PUBLISHING.md + body: Fixed broken Hombrew cask link for etcher +- version: 1.5.10 + date: 2019-03-12T15:29:01.000Z + commits: + - hash: 66b19677bf1e57455242b5e62ffcadee06b97eb6 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Use APPDIR from env in the child writer + body: null + - hash: 2e1763f19aa33ef90057374d997fcc3be7bdc5c9 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Fix Makefile + body: null + - hash: 7f8f38ddf154ac9d68f51d6055f47d2e378fa7f7 + author: Alexis Svinartchouk + footers: + changelog-entry: Update resin-scripts + change-type: patch + subject: Update resin-scripts + body: null +- version: 1.5.9 + date: 2019-03-06T15:56:46.000Z + commits: + - hash: a979ae3ced134731d15f8cd1de3f049c120a6e5d + author: Alexis Svinartchouk + footers: + changelog-entry: Update etcher-sdk to 1.3.0 + change-type: patch + subject: "upgrade(etcher-sdk): Update etcher-sdk to 1.3.0" + body: null + - hash: 3b16c06f70e9c1b57aa9c93be7098123d2549853 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: "upgrade(scripts): Use master branch of resin-scripts" + body: null +- version: 1.5.8 + date: 2019-03-01T19:00:24.000Z + commits: + - hash: ac463e0f65acb7e4cccb8c10f72ffb2d9d6149fa + author: Alexis Svinartchouk + footers: + changelog-entry: Update ext2fs to 1.0.27 + change-type: patch + subject: "upgrade(ext2fs): Update ext2fs to 1.0.27" + body: null +- version: 1.5.7 + date: 2019-03-01T16:05:34.000Z + commits: + - hash: 388fc2f7d980ec24d76e7155f770732f4c2707dd + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Remove screenshot + body: null + - hash: 136ca282eb3ebd4251da28780ff56ee2f660272e + author: Robert Vojta + footers: + changelog-entry: Fix disappearing modal window + change-type: patch + signed-off-by: Robert Vojta + subject: "fix(gui): Fix disappearing modal window" + body: null + - hash: 1d6958a67e24d1148b70f09ffbc0df70dda83583 + author: Robert Vojta + footers: + changelog-entry: Fix blurred background image + change-type: patch + signed-off-by: Robert Vojta + subject: "fix(osx installer): Fix blurred background image" + body: null + - hash: 16e8aa2447d15dde98336b14710aa704f2030929 + author: Robert Vojta + footers: + change-type: patch + signed-off-by: Robert Vojta + subject: Fix AppImages link + body: null + - hash: e73a57745215cf73829ce1ede225a05f49cbff39 + author: Robert Vojta + footers: + change-type: patch + signed-off-by: Robert Vojta + subject: Fix electron links + body: null + - hash: b6ad6e0a85a84b081327d5adb49d4b2e3164bd8d + author: Robert Vojta + footers: + change-type: patch + signed-off-by: Robert Vojta + subject: Fix macOS version requirements + body: null + - hash: 3cdb0f840e29da2b2275148e4e86a177dda7b12f + author: Robert Vojta + footers: + change-type: patch + signed-off-by: Robert Vojta + subject: Fix electron links + body: null + - hash: 8e96adeda90404e6a4564dde0cd0292b82f1e212 + author: Robert Vojta + footers: + change-type: patch + signed-off-by: Robert Vojta + subject: Fix copyright year + body: null + - hash: 90838c99fc376398eb7c0e80b71bbe84e728f259 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Add missing line for supporting flashing CM3+ + body: null + - hash: fea230cfabc5de2d75c850ce7209789e9bd04c6f + author: Robert Vojta + footers: + changelog-entry: Update docs + change-type: patch + signed-off-by: Robert Vojta + subject: "fix(docs): Update macOS contributing info" + body: null +- version: 1.5.6 + date: 2019-03-01T10:44:47.000Z + commits: + - hash: 2614f3261c59c1070dfdaad9409bf265a14b28fc + author: Alexis Svinartchouk + footers: + changelog-entry: Target electron 3 runtime in babel options + change-type: patch + subject: Target electron 3 runtime in babel options + body: This saves around 40KiB in generated/gui.js +- version: 1.5.5 + date: 2019-02-28T12:10:25.000Z + commits: + - hash: 4317892421dff1e8d53ed10a3546885e368fea7e + author: Alexis Svinartchouk + footers: + changelog-entry: Update etcher-sdk to 1.1.0 + change-type: patch + subject: Update etcher-sdk to 1.1.0 + body: null + - hash: 6b6a0d7b4f55bc5809ae46d6eb9743a8c3cbdcef + author: Alexis Svinartchouk + footers: + changelog-entry: Avoid `Invalid percentage` exceptions + change-type: patch + subject: Avoid `Invalid percentage` exceptions + body: null + - hash: f0374cf9d9dfb533d16adc29389359834f16f082 + author: Alexis Svinartchouk + footers: + changelog-entry: Fix error message not showing when an unsupported image is selected + change-type: patch + subject: Fix error message not showing when an unsupported image is selected + body: null + - hash: 5299d958f29f3386090936625b1a33b568c13e47 + author: Alexis Svinartchouk + footers: + changelog-entry: Fix error when event.dataTransfer.files is empty + change-type: patch + subject: Fix error when event.dataTransfer.files is empty + body: null + - hash: dd583a176fefb3346093bd89932cf06b9a61a74c + author: Alexis Svinartchouk + footers: + changelog-entry: Don't pass undefined sockets to ipc.server.emit() + change-type: patch + subject: Don't pass undefined sockets to ipc.server.emit() + body: null +- version: 1.5.4 + date: 2019-02-28T10:01:03.000Z + commits: + - hash: 09e6c6422dfee471d69b854aa1603a20f9a48974 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Add missing step for submodule cloning in README + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Add missing step for submodule init & update + body: null +- version: 1.5.3 + date: 2019-02-27T21:09:03.000Z + commits: + - hash: caeb84f58bc2286d0b004ad8d219302c77979c14 + author: Giovanni Garufi + footers: + change-type: patch + signed-off-by: Giovanni Garufi + changelog-entry: Throw error if no commit is annotated with a changelog entry + subject: Throw error if no commit is annotated with a changelog entry + body: null + - hash: 8e372f1e93f7c5e56a2bcf5a881d0ea8aa5f1062 + author: Giovanni Garufi + subject: Fix changelog + body: null + - hash: 1f3a02b83ddef6e26678cca5b96bc57f2f3db8e1 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Bump version in npm-shrinkwrap.json + body: null +- version: 1.5.2 + date: 2019-02-26T14:17:27.000Z + commits: + - hash: 3be702907806f1eed2f9e5506a68507eea039d39 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Enable versionist editVersion + body: null +- version: 1.5.1 + date: 2019-02-25T11:04:33.000Z + commits: + - hash: 90c8483df8147390c1941c7dfbc881409fc0afc8 + author: Giovanni Garufi + footers: + changelog-entry: Removed lodash dependency in versionist.conf.js + change-type: patch + signed-off-by: Giovanni Garufi + subject: Remove lodash dependency in versionist.conf.js + body: null +- version: 1.5.0 + date: 2019-02-21T16:13:28.000Z + commits: + - hash: c88245954d7cf167eca87e18ef07bc2675b56207 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Integrate etcher-sdk + body: null + - hash: db119d523065ca130372c2686b94804b812a0d44 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Allow flashing from sources for which we don't know the compressed size + body: "* don't show any percentage or eta, show the bytes written instead" + - hash: 41a7fc4de52a5a7c5e430f0f1ebc1aa4ad821cbd + author: Alexis Svinartchouk + footers: + change-type: minor + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Show raspberry pi usbboot update progress in devices list + body: null + - hash: 082c77586f60772cb53302f3ed16232545bdd375 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Handle the last fail as an error if all devices failed + body: null + - hash: 34b7c1be812376c86f04fb3e6dafab8a4ca9d180 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove usage of old sdk in supported-formats + body: null + - hash: da072e7621fd57e09d6a60c429f17a4d24c8cd72 + author: Alexis Svinartchouk + footers: + change-type: major + subject: Update etcher-sdk and use it in the cli + body: null + - hash: ce9f14262173cc218c95a24e74e47f79263680cf + author: Alexis Svinartchouk + footers: + change-type: major + changelog-entry: Upgrade to Electron v3 + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Replace imageStream with etcher-sdk in the react file selector + body: null + - hash: 43319853ef7a58b62fa284ebb814ac083263a99e + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Remove lib/sdk and its tests + body: null + - hash: bf29312ecf98bf6f6bd683899ddd404acd0245c9 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: lint + body: null + - hash: 3c007cea34caf078f9e108b460c73f27e86cfd8b + author: Alexis Svinartchouk + footers: + change-type: patch + subject: Update etcher-sdk and load DriverlessDeviceAdapter on windows + body: null + - hash: ccc9076a8073c4ecadc5b268450ea79b543920d2 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(lib): Fix use of non-existent dependency" + body: null + - hash: d65dc6ccacbf95459cbd7ebdfdbefeb5890b8153 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(test): Turn SDK integration tests for the GUI back on" + body: null + - hash: 6d79a8e23a3cf55fd76c832af2204c40acbb9f9d + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(lib): Fix MIME type exclusion condition" + body: |- + As `mime.extension()` returns `false`, instead of `null` or `undefined`, + this condition simply needs to check for truthyness. + - hash: a8f8c2cd859eb12432fdcb2331d0b4c42c1adc20 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(test): Sort supported extensions to fix order mismatch" + body: null + - hash: ef456960155554b74b2c8aabe8974293f5697c2d + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "upgrade(package): Update mime-types 2.1.15 -> 2.1.18" + body: |- + This update includes a previously missing mapping for gzip + (`application/gzip`), which contributes to fixing gzip compressed + image detection in the new SDK + - hash: 911d3a91883e8abbd4fe09af8c78961b884bb501 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(test): Sort compressed extensions before comparing" + body: null + - hash: bc028ed41fbb7c0a65dc6656cca72b6ddc970382 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "upgrade(package): Update etcher-sdk git ref" + body: null + - hash: a4dfa5f281bff5220013bd1e461fb5c38ab68c86 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(store): Restore drive object validity check" + body: null + - hash: 700341f9cc07ddac89ba8c7d9c98346561b60fd9 + author: Alexis Svinartchouk + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: "fix(store): Lowercase extensions before comparing" + body: null + - hash: 8cc33b46bbb950f18f775fbd6f8186be3609ab1b + author: Alexis Svinartchouk + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: "fix(package): remove diskpart helper, it is in the sdk now" + body: null + - hash: c37270ea081c83d628b2204c97428cb65f6b390e + author: Alexis Svinartchouk + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: feat(driverless) show driverless devices + body: null + - hash: 73e4827249f52107e4138f9575d8f469de901d27 + author: Alexis Svinartchouk + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: "fix(tests): Remove throw if no percentage or eta test" + body: |- + Since 25916200f2864a9b137325f919c0f8ef5d62fa60 we can handle a progress + state with no percentage or eta. + - hash: e85251d2e37a317d1a0fae64a8eb1447640fc443 + author: Jonas Hermsmeier + footers: + change-type: patch + changelog-entry: Fix incorrect drives list on Linux + signed-off-by: Jonas Hermsmeier + subject: "fix(image-selection): Only trigger digest loop after setting image" + body: null + - hash: 8c8a0bf8eb64bd9a8bd5019ac6337665ee5e9959 + author: Alexis Svinartchouk + footers: + change-type: patch + signed-off-by: Alexis Svinartchouk + subject: "upgrade(package): Update to etcher-sdk@0.1.7" + body: Also update the shrinkwrap file + - hash: 7ca3e2b5199bf79ec33f17828a96b89d410a071b + author: Alexis Svinartchouk + footers: + change-type: patch + signed-off-by: Alexis Svinartchouk + subject: "fix(tests): Fix gui tests" + body: null + - hash: c16fbb5b474ae8364ba648897b5176f81b799cff + author: Alexis Svinartchouk + footers: + change-type: patch + signed-off-by: Alexis Svinartchouk + subject: "upgrade(package): Update to etcher-sdk@0.1.9" + body: null + - hash: bf3d069aad6ebc81a76c596f80d05bb15550e26a + author: Alexis Svinartchouk + subject: "upgrade(package): Update to etcher-sdk@0.1.13" + body: null + footers: + change-type: patch + signed-off-by: Alexis Svinartchouk + - hash: 9fa32df3a68d8fe3c8a8ffa9b408846fe4543143 + author: Alexis Svinartchouk + footers: + change-type: patch + signed-off-by: Alexis Svinartchouk + subject: "fix(gui): Allow undefined eta" + body: null + - hash: 2525456d8b4c70e028365dbaff1a8ff21365ed83 + author: Alexis Svinartchouk + footers: + change-type: patch + signed-off-by: Alexis Svinartchouk + subject: "fix(shared): Fix getDriveImageCompatibilityStatuses() and tests" + body: null + - hash: 9b76abe2ed4f4398bbe6baf5513c773b43ff948e + author: Alexis Svinartchouk + footers: + change-type: patch + signed-off-by: Alexis Svinartchouk + subject: "fix(gui): Allow drives to be objects" + body: This fixes an error when plugging usbboot devices. + - hash: f2ca997195ca71764085bc359abd4c4cc6e12d0f + author: Alexis Svinartchouk + footers: + changelog-entry: Changed “Drive Contains Image” to “Drive Mountpoint Contains Image” + change-type: patch + subject: Change "Drive Contains Image" label. + body: |- + Use "Drive Mountpoint Contains Image" instead as the image may not be on + this drive but on a drive mounted in one of the mountpoins of this + drive. + We still don't want to allow flashing this drive in that situation. + - hash: 2dc4fef4d3c7a71ca66dc4c9be93f0ff12157469 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Update scripts to build on other Linux distros + body: null + - hash: e946f388c00c4c1ddfbd29495236727dd85d7415 + author: Alexis Svinartchouk + footers: + change-type: patch + subject: ProgressBar.disabled prop is a boolean + body: null + - hash: 25b814e796337df638c013980461e0cbc6b25267 + author: Agnieszka Domanska + footers: + change-type: patch + signed-off-by: amdomanska + subject: "docs: Add info about required npm version" + body: Npm 3.10 version is required to install dev tools correctly on Linux. + - hash: 1c8c36a2240a2bd7ba0faa2d5773ac4991d32460 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Update nodejs req to 6.11 (fixes package build) + body: null + - hash: 6143023502c5319d0278a264ee3a1dfd4ce68a88 + - hash: a8a75f22b2a0297c468bd4058f31eb663310703e + - hash: d07d535993460521d7d6a0b3c2c716e10d1134d0 + - hash: 268c5302e8bc42068b3ae2b717e4872cfeed88a8 + - hash: 8630af7646159fd697d4c0e81cf2c7fdaef09131 + - hash: 98a8588c1b7388a8fe9e9fb79611ec13bd0fe47c + - hash: a42e81cf8c4a1171bb7d7dc5104d3a6792a25853 + - hash: e68dbcf4ee940f2d03f84efe4d5c63e44fea5827 + - hash: caf5f10326a65bc560294872c823e2d8ecdc6a66 + - hash: 5ae93bf6d0611fa930765729c16587e5fd93a6e0 + - hash: 47f2336673672f6b47466f8056ce1b28c320833e + - hash: 21f1f4e50334f2f801b6c058e4eeefe366cc213b + - hash: 4f7cc7dd6b864fb9643e803cf5b5dabc805be26f + - hash: d3c2cd42157b004c80f432de4003e3f393caeb3d + - hash: 254b48265106b1eb0212e9137f5cbaed1ca77341 + - hash: a541c863be774cd2e6acb27c94c3527973bb3b19 + - hash: c50553fbf6c00edfd4ce4ee7b5c07295ffb9dad2 + - hash: b270d819a8edd8fbd5ea4da8b4da9ae6bdcbd1c8 + - hash: 7d2ba45620134f0c72f1a85bf5f084defc0426e1 + - hash: 47937d6aaa2dc30513e08f51768d303a536cdfa0 + - hash: 6b270885bffa9f5b8adb2241c754bb5f5d1b7ef9 + - hash: 63967d15586e5a9e84aa48b98e1bf665f1fba18d + - hash: fd765443e4228285e2ac59d153cfe391f1bc79d4 + - hash: 8d79103392e1cd22865138f2abecdeda5b8e626e + - hash: 871db09447c04532768c0da29555536c5e2f1b44 + - hash: 73f64d93b197d333fd70507b6299940ef1809536 + - hash: a237bfd9303377b234b40e4769a190cf2f41acd5 + - hash: aaccd10c2a177dfba91aaf3155e5898128790ad7 + - hash: 65d86460cbb56cb3cd307bddd07bdd12f8536a35 + - hash: 645e114a1fc7121bc78044a13f702f337a6c579e +- version: 1.4.9 + date: 2018-12-23T14:54:07.000Z + commits: + - hash: b8756edd29730448d45b20cacbfbf7ee43570926 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: New dmg package background assets + body: null + - hash: d71b3fe1bc669ac0e475e0cc8becd072a637d8c5 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: v1.4.9 + body: null + - hash: ad4226ace7ac585738b516174eedeefc25295a15 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Invert analytics event probability + body: null + - hash: 87533f441715074b5fa40f69f74687a37945de73 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Remove forwarding of SafeWebview console messages + body: null + - hash: 22acc5ae96f73d0d4babaae3655b0c7bfd3ce130 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: minor + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Customize Mixpanel configs + body: null + - hash: cf722427ab0221e18c6e109ffe10c7e2b6aef890 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Added React component for the Flash Another button + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Restyle success screen and enlarge UI elements + body: null + - hash: 64ec6d0e58f4893712c5574661f323866a67dd5c + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: minor + changelog-entry: Added React component for the Flash Results button + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Convert flash results component to React + body: null + - hash: dd8ef288f78776f718953bebca01a85b664fdd04 + author: Chris Crocker-White + footers: + change-type: patch + signed-off-by: Chris Crocker-White + subject: Update URLs in GUI to balena + body: null + - hash: caf5a8917ca6c41a4a27cf0f1afd333a5ea11ce0 + author: Chris Crocker-White + subject: Merge branch 'master' into chrisys-patch + body: null + - hash: db8d2953cb46004020a6f7068f65c28dbe967a58 + author: Randall Wood + subject: Update MacOS installation instructions. + body: Homebrew/homebrew-cask#55358 changed the name used for installation. + - hash: 7565e809b072de476b20450ad68212918eeb6a55 + author: Otavio Salvador + footers: + signed-off-by: Otavio Salvador + subject: Add `.wic` image extension as supported format + body: |- + The `.wic` is a widely used image format in the OpenEmbedded / Yocto + Project ecosystem and is straightforward to be supported. + - hash: 948a04122afc6ad81ae0636046fbcb3d692c6d9b + author: Eate + subject: Updated Chocolatey section + body: Previously, the section header was a "###" header, and I changed it to a + "####" header like all the other install variants so it is the same + level header. I also added uninstall instructions like the other + sections had. + - hash: 7354fa30500970e3e090efa02b332e822a0d87ad + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Use explicit names for safe-webview events + body: null + - hash: 6d0fea19835ef20d14c80f809782e46ed0160e98 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Fix update notifier error popping up on v1.4.1->1.4.8 + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: "fix(GUI): Fix update notification error" + body: Remove "this" and use "exports" instead + - hash: 5419b4b732a6ea71dccc5bf075011ba34fd9c1e1 + author: Jacob + subject: Use https for fetching sub modules + body: This switches over the sub module to using https instead of ssh. It + simplifies a lot for people packaging the application and you won't need + to have ssh configured correctly. + - hash: a52d7452503314f46e4698d9d1a732f1c16a4a89 + author: Lorenzo Alberto Maria Ambrosi + subject: Merge branch 'master' into gitmodule-https + body: null +- version: 1.4.8 + date: 2018-11-23T17:52:19.000Z + commits: + - hash: 9a83bd4267a95568f132024c77e4362207021285 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: v1.4.8 + body: null + - hash: 20996b153d3977c1bd78d1b505f044c9d86c9a73 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Reject drives with null size (fixes pretty-bytes error) + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: "fix(GUI): Reject drives with null size" + body: null + - hash: 2017df9ec65c934ee95391813c5461b5db0553e9 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Added featured-project while flashing + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: "feat(GUI): Add featured-project component" + body: null + - hash: 76af6e975e0eca5d31a9e15edea6bdda8a28d1e8 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Add flashing info while showing webview + body: null + - hash: afd888e14d3611e35111aff364cf20293f84943f + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Moved back the write cancel button + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: "fix(GUI): Fix styling issues with buttons" + body: null +- version: 1.4.7 + date: 2018-11-13T14:49:43.000Z + commits: + - hash: 2158772e3b979c4bb2a186f757c1f19e00242ebd + author: Alexis Svinartchouk + footers: + change-type: patch + subject: "lint: don't run codespell on svg files" + body: null + - hash: 7fb382bee0239d4fdc34a29867c0088a172b38ed + author: Alexis Svinartchouk + footers: + change-type: patch + subject: "fix(usbboot): Limit usbboot transfers to 1MiB" + body: null + - hash: 6e9deeba5b040eb1d7f2d818131331a38d7f8c9c + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: major + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: v1.4.7 + body: null + - hash: dd8b7e42d6bbda88b0ff6686e39e8bc8f5e16268 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + changelog-entry: Modify versionist.conf.js to match new internal commit guidelines + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: "fix(versionist): Adapt versionist.conf.js to new guidelines" + body: null + - hash: a3f7239c1b50b69202ec186f0a5cee08a9cd5fe4 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Add balena iconset & osx installer background + body: null + - hash: c4c4d347cfbd83457ff2ca98eec50a0ef1de0d1a + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Update application name & copyright + body: null + - hash: a229c9e10e7deb16fdc0fa60697de185c8a01b06 + author: Lucian Buzzo + footers: + change-type: patch + signed-off-by: Lucian Buzzo + subject: "docs: Fix typo in contributing guidelines" + body: null + - hash: 2907cd173bb045677b8f57560b0e0bcb3331d6c4 + author: amdomanska + footers: + change-type: minor + signed-off-by: amdomanska + subject: "refactor(GUI): Convert Select Image button to Rendition" + body: Convert Select Image button to Rendition component +- version: 1.4.6 + date: 2018-10-29T22:29:23.000Z + commits: + - hash: c1a8b0c30322ea3412bd418c1475e46255b2e9bb + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: v1.4.6 + body: null + - hash: c366fbde22efa33d79135033975dba596908aa0d + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Put flash cancel button in foreground + body: null + - hash: 9cc65a386bf6887df5b29261533464dccb0f0017 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Add new logos + body: null + - hash: 8eb11a8957bc40b29007b1778a072e59a856f805 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Change resin.io to balena.io + body: null + - hash: 407325b8ceadc26fab11527d53187f0d2287b16b + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Fix incorrect file constraint path + body: null + - hash: cb701a7bbccff076f5f7f55e8de68be867ed7e0f + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Change spectron port + body: null + - hash: c2c59f4a9e997133e20a1d6e041fb796cb92dbb6 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: Enable React lint rules + body: null + - hash: fd5385b127b09bb912263629f745cecf240b691f + author: Alexis Svinartchouk + footers: + signed-off-by: Alexis Svinartchouk + subject: "fix: Fix 64 bit detection on arm" + body: null + - hash: ac068f353acc53de5ed4edd7b06f5791307abb40 + author: Alexis Svinartchouk + footers: + signed-off-by: Alexis Svinartchouk + subject: "fix: Provide a Buffer to xxhash.Stream" + body: This fixes the digest being a number instead of a buffer. + - hash: abf1e4a8ac9d265d6387060e86c13c783fd4e892 + author: Lorenzo Alberto Maria Ambrosi + footers: + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: "fix: Correct 1.4.5 release date & remove checklist" + body: null + - hash: 3855bb4d56ac57a2309f47da74217f55d049d281 + author: Juan Cruz Viotti + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: Use Resin CI scripts to build Etcher + body: null + - hash: b3aab5116ad4b903a200d4c4ff5b07bfcc1861df + author: amdomanska + footers: + change-type: minor + signed-off-by: amdomanska + subject: "refactor(GUI): Convert Progress Button to Rendition" + body: Convert progress-button component to Rendition +- version: 1.4.5 + date: 2018-10-09T09:42:17.000Z + commits: + - hash: 7e01eca7f5e5fa60311d805baa9f6e833bddc014 + author: Juan Cruz Viotti + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + see: https://github.com/resin-io/etcher/pull/1892 + changelog-entry: Download usbboot drivers installer when clicking a driverless + usbboot device on Windows. + subject: "feat(GUI): link to drivers when clicking a driverless usbboot device" + body: |- + Step 2 until we support installing the drivers from within Etcher. This + also introduces an "Open drive link" Mixpanel event. + - hash: 207c0d612d7e5f3cc9ccec867c46eeb902f35075 + author: Jonas Hermsmeier + footers: + change-type: patch + signed-off-by: Jonas Hermsmeier + changelog-entry: Add font-awesome. + subject: "feat(gui): Add simple confirmation modal" + body: null + - hash: b9f9968f8412211e48e3daf6eea5916118f4230c + author: Jonas Hermsmeier + footers: + change-type: patch + signed-off-by: Alexis Svinartchouk + changelog-entry: Add instructions for installing and uninstalling on Solus. + subject: "feat(gui): Add CTA in drivelist, update drive download modal" + body: null + - hash: 49edd1a6dc813494fbce9fc73e4782fd7f8e8f61 + author: Lorenzo Alberto Maria Ambrosi + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: "fix(GUI): Add data on events" + body: |- + Application session UUID for global app events + Flashing workflow UUID for every flashing session + Flash instance UUID for every flashing session + - hash: 37b25d84228cd633858f2fd44a8197a953dd26de + author: John (Jack) Brown + footers: + change-type: patch + signed-off-by: Jack Brown + subject: "resinci: Set private: true in package.json to avoid running npm builds" + body: null + - hash: 0d80957639e5cc0cfa67c28be1e381a197a123aa + author: Jonas Hermsmeier + footers: + change-type: patch + signed-off-by: Jonas Hermsmeier + subject: "chore(webpack): Set NODE_ENV to production" + body: This enables production builds for React + - hash: e9760c21007a6388b9758a1825cf5f151afb2e06 + author: Jonas Hermsmeier + footers: + change-type: patch + signed-off-by: Alexis Svinartchouk + subject: "fix(gui): Fix missing promisify in file picker model" + body: null + - hash: 31cd33f86c010ecdc398e3c2b290fdec67aeb6cc + author: Jonas Hermsmeier + footers: + change-type: patch + signed-off-by: Alexis Svinartchouk + subject: "upgrade(package): Update winusb-driver-generator" + body: |- + This updates `winusb-driver-generator` to the latest version, + which supports building under VS 2015 and running under Electron 2.0+ + - hash: 1bb86fe4a84b9bb6acad4c8886dd482e8903e81b + author: Jonas Hermsmeier + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: "feat(gui): Enable device specific constraints for file selection" + body: |- + This adds the ability to restrict the file selection to a given device, + only making its mountpoints accessible. + - hash: f9805f3bc741a94076f16408e4611cf6ce9fcea4 + author: Jonas Hermsmeier + footers: + change-type: patch + signed-off-by: Salvatore Zappalà + subject: "fix(app): Fix settings being unavailable when packaged" + body: |- + This fixes an issue where the settings model would be missing + from Etcher when packaged, as it's used in two different contexts; + namely the webpack bundle and the main process. + - hash: 0cabac1eed033e63a0dae9ae52a82091e4d5a7ad + author: Jonas Hermsmeier + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: "refactor(gui): Add separating borders to file selector" + body: |- + This adds thin gray borders to the control surfaces in + the file selector for better visual distinction + - hash: c0ec74bbb794534b3b3afa02e3fde789b84397e7 + author: Jonas Hermsmeier + footers: + change-type: minor + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: "feat(gui): Add full filename to file selector" + body: This adds the display of the full filename to the file selector. + - hash: c3ff03054238a4973c961f7c234b6211e0857b5c + author: Jonas Hermsmeier + footers: + change-type: patch + signed-off-by: Michael Angelos Simos + subject: "refactor(gui): Refactor file picker fs I/O" + body: |- + This refactors the experimental file picker to avoid fs i/o + in as many places as possible to improve performance. + Further, rendering performance is improved by avoiding unnecessary + element state changes invalidating components. + Also, recent files & favorites have been temporarily disabled + due to lack of need for Etcher Pro. + - hash: 2f4a7352d98e9aeafbda7b908756f6f5fcf0ec24 + author: Jonas Hermsmeier + footers: + change-type: patch + signed-off-by: Michael Angelos Simos + subject: "fix(webpack): Exclude all node externals / node_modules" + body: |- + This adds `webpack-node-externals` to exclude node_modules, + immensely reducing bundle size and avoiding complex exclusion rules + for the etcher-sdk + - hash: 2fb8ad146f4d8c8d9fc14d726c162d0e6e336277 + author: Jonas Hermsmeier + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: "fix(gui): Fix an inifinite digest loop trigger" + body: |- + This fixes a guard against infinite digest loop triggering + that was erronously dropped during a rebase. + - hash: da23740f17da045827001d62259bdd066e528dc0 + author: Jonas Hermsmeier + footers: + change-type: patch + signed-off-by: Lorenzo Alberto Maria Ambrosi + subject: "upgrade(package): Update lodash to 4.17.10" + body: |- + This updates `lodash` to mitigate a prototype pollution vulnerability. + See https://nodesecurity.io/advisories/577 + - hash: 92d969b0756dc0fc5e43d4bdfd0b9d84b017aeb2 + author: Jonas Hermsmeier + footers: + change-type: patch + signed-off-by: Alexis Svinartchouk + subject: "fix(gui): Fix error with empty drive blacklist" + body: |- + This fixes an error occuring if the drive blacklist + is empty, and not split correctly + - hash: f798fef2122fe1a96939dcd11070288a4731a360 + author: Benedict Aas + footers: + change-type: patch + signed-off-by: Jonas Hermsmeier + subject: "fix(GUI): restrict webkit drag to header" + body: |- + We ensure that the `-webkit-app-region` attribute is only set to `drag` + on the header element and we explicitly disable it on modals, as this + has unintended behaviour on a non-draggable window with touch-screens. + - hash: 73d287e7ee0c8aac57b652cdfc3c74a948741369 + author: Jonas Hermsmeier + footers: + change-type: minor + signed-off-by: Jonas Hermsmeier + subject: "feat: Use settings for feature control" + body: null + - hash: 6a0198639f3332ced7a12c89278777ebb510ca09 + author: Jonas Hermsmeier + subject: "chore(app): Use settings instead of env vars" + body: null + footers: + change-type: patch + - hash: 40d84b7a826b9d34ecf824fe3a4101b0f347f2af + author: Jonas Hermsmeier + subject: "refactor(local-settings): Log JSON parse errors" + body: null + - hash: 9eb3eea3f1c428a477fc2f9559d1cd40beeebcee + author: Jonas Hermsmeier + subject: "refactor: Move shared/store.js -> gui/app/models/store.js" + body: null + - hash: c2e47ca9dcb792787c1c6f67fc49778ecc785f2b + author: Jonas Hermsmeier + footers: + change-type: minor + subject: "refactor: Remove use of localStorage for local settings" + body: null + - hash: 2271f3214089f1bfc93902c0853fac83b4fdc3d3 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "test(settings): Update test specs accordingly" + body: null + - hash: 45b62f0e7729344927fb56b23ccee917a3a979f5 + author: Jonas Hermsmeier + subject: "refactor(gui): Move shared models to app/models" + body: null + - hash: b4f2bc1cb391d45c2f5aac471851e9398a5675f7 + author: Jonas Hermsmeier + footers: + change-type: minor + subject: "feat(app): Make store change-observable" + body: |- + This adds true change observability to the store, + as the `.subscribe()` callback triggers with every dispatch, + even if the data didn't change. + Now `store.observe(onChange)` can be used to only be notified + once the state data actually changes + - hash: 872cd90dc66b230a77de853d8e491347ba2de045 + author: Jonas Hermsmeier + subject: "fix(test): Fix lint errors & tests" + body: null + - hash: 00ab816791993c309b795ec47aee5a07a7d3fc60 + author: Jonas Hermsmeier + subject: "fix(app): Fix config path on Windows, typos" + body: null + - hash: ed25dd931e65d8eb9b6b92d301978397dc64b040 + author: Jonas Hermsmeier + subject: "refactor(store): Return unsubscribe directly" + body: null + - hash: a90287288051c8d447e715e51467908139200878 + author: Benedict Aas + footers: + change-type: patch + subject: "minifix(GUI): move success banner back down" + body: null + - hash: 0da17de42262452e2563e3d63b02e289ea309efa + author: Benedict Aas + footers: + change-type: patch + subject: "fix(GUI): file-picker performance and design improvements" + body: >- + - Replace onClick arrow functions in all components that use them for + + efficiency reasons: 300-500% speed-up + + - Sort by folders and ignore case for better UX + + - Remove use of `rendition.Button` in files, leading to a 10-20% + + performance increase when browsing files + + - Proper sidebar width and spacing + + - Recents and favorites are now filtered by existence async for a tiny + + performance improvement + + - Make Breadcrumbs and Icon pure components to stop frequent + re-rendering + + - Initial support for array constraints + + - Use first constraint as initial path instead of homedir if a + + constraint is set + + - Use correct design height on modal, `calc(100vh - 20px)` + + - Reset scroll position when browsing a new folder + + - Fuse Bluebird `.map()` and `.reduce()` in + + `files.getAllFilesMetadataAsync`. + + - Use `localeCompare`'s own case-insensitive option instead of calling + + `.toLowerCase()` twice on `n-2` files compared. + + - Use 16px font sizes in sidebar and files to match design. + + - Disable `$locationProvider.html5Mode.rewriteLinks`, which seemed to + + take 50ms of the directory changing time. + + - Leave file extension as-is in `files.getFileMetadataSync` and the + + async counterpart for a very minor performance improvement. + - hash: d99fe944f3e29484e4ad32d52076a071e2e5b0d4 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "test(eslint): Fix JSX not being linted" + body: null + - hash: fc22e9e28a64640ff4ab0d46af79c4e5632f0697 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "upgrade(package): Update React to v16" + body: null + - hash: 4ddac50d9bd6c89287621be104cefdcb147a07ba + author: Benedict Aas + footers: + change-type: patch + subject: "minifix(GUI): resolve react missing key field warning" + body: We attach key fields where necessary to make the warnings go away. + - hash: fffdeb1320b0efa6c5feda5866cce4eb968f18cf + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "chore(package): Add npm run script for webpack" + body: Make life simpler + - hash: 201995eb90862d16bcf27a0328bfa1a7b85cbed4 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(diskpart): Fix diskpart argv when tmpdir contains spaces" + body: |- + This escapes the diskpart script filename when shelling out, + to avoid failure when the username and thus the `os.tmpdir()` path + contains spaces. + - hash: 2986d85b26bfd8022389bdb34185dbbf1f885559 + author: Benedict Aas + footers: + change-type: patch + subject: "fix: ensure file-picker is slicing arrays" + body: |- + We ensure the file-picker is slicing arrays when the localStorage values + aren't available. + - hash: 117a7762e1340a4a54d8f71ff552864fadbea69f + author: Benedict Aas + footers: + change-type: patch + subject: "fix: add missing files module" + body: |- + We add a convenience module for file and path operations. + Tests included. + - hash: 67283821414583a13613d28456704266e50025a7 + author: Benedict Aas + footers: + closes: https://github.com/resin-io/etcher/issues/2243 + change-type: patch + changelog-entry: Hide unsafe mode option toggle with an env var. + subject: "feat(GUI): hide unsafe mode option with env var" + body: |- + We hide the unsafe mode option toggle with an env var + `ETCHER_HIDE_UNSAFE_MODE` that also enables unsafe mode. + - hash: c08cf61d0ca0c203c504418502b09a7f3bcf3318 + author: CherryDT + subject: Fix devtools key binding for Windows in SUPPORT.md + body: null + - hash: c5e5141b219057fcea35ae5bca18111a8ac313e9 + author: Benedict Aas + footers: + closes: https://github.com/resin-io/etcher/issues/2264 + change-type: patch + subject: "feat: blacklist devices by device path" + body: |- + We use `devicePath` instead of `device` to blacklist drives using the + `ETCHER_BLACKLISTED_DRIVES` environment variable. + - hash: 447efc70966b7ee5cda0e4546dbe9e6062486694 + author: Jonas Hermsmeier + footers: + change-type: feat + subject: "feat(gui): Add desktop notification setting" + body: |- + This adds a setting to disable desktop notifications, to be controlled + via configuration file + - hash: 2a6670a4046732a3b6387f10143cd7c22345b391 + author: Benedict Aas + subject: "feat(GUI): use design background and drive size ordering" + body: |- + We use the new design background color, and order the drive step size in + accordance with the new design as well. + Related: https://github.com/resin-io/etcher/issues/2310 + Change-Type: patch + Changelog-Entry: Use new design background color and drive step size + ordering. + - hash: 6232cc7d49781716f9d3d4b44d760ca5ed4d1fc0 + author: Benedict Aas + footers: + related: https://github.com/resin-io/etcher/issues/2285 + change-type: patch + changelog-entry: Add electron-native file-picker component. + subject: "feat(GUI): add electron-native file-picker component" + body: >- + We add a file-picker written with Rendition/React. It is activated with + + the `ETCHER_EXPERIMENTAL_FILE_PICKER` environment variable. Further + + customisation can be done with the + `ETCHER_FILE_BROWSER_CONSTRAIN_FOLDER` + + variable that takes a path and allows one to constrain the file-picker + to + + a folder. + - hash: 687e0b563b0dc3619ece4ce49d353d5838a21ff6 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "minifix(gui): Don't check for updates when in resin" + body: |- + This disabled Etcher checking for updates & showing update notifications + if running under resinOS with update locks enabled + - hash: 53f8e9328d3099ec05745cb92b2c4bd883b6f2e5 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "feat(gui): Add ability to set analytics tokens via env" + body: |- + This adds the ability to set the Sentry & Mixpanel API tokens + via environment variables. + - hash: e0ebdc904586aae5afff28ca9d2de71b26db25b2 + author: Benedict Aas + footers: + closes: https://github.com/resin-io/etcher/issues/2310 + change-type: patch + subject: "feat(GUI): use new design blue and spacing" + body: We use the new design blue, spacing, and order of step buttons. + - hash: 3d47f494a8ade53195814a0c05b73460b846a0b0 + author: Jonas Hermsmeier + footers: + change-type: minor + subject: "feat(gui): Add resin update lock based on inactivity" + body: |- + This adds functionality to acquire & release the update lock + when running under resinOS, re-using the `ELECTRON_RESIN_UPDATE_LOCK` + environment variable from `resin-electronjs`. + Further this adds the `ETCHER_INTERACTION_TIMEOUT_MS` env var, to + facilitate adjusting the inactivity period required to release the lock. + - hash: ad6be11bbca1bbe3f17e207bd94e9cd17624e6b5 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "upgrade(package): Bump drivelist 6.1.7 -> 6.2.2" + body: This will enable use of unique device paths on Linux + - hash: 7eba1ece2693383a98072d2385ffa90db890034d + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "doc(README): Use ubuntu keyserver for apt-key" + body: |- + As pgp.mit.edu has become extremely unreliable, this switches to + keyserver.ubuntu.com for retrieval of package keys + - hash: 5863319c0bad978b4de16405a7d24a2519b54fec + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "minifix(gui): Only enable Kiosk Mode when FULLSCREEN is set" + body: |- + This fixes the `kiosk` setting always being true, and causing + the operating system's desktop to disappear. + - hash: fb67b71faae29f550c10b4d29ba27f9d44418873 + author: Benedict Aas + subject: "feat(GUI): blacklist drives with an env var" + body: |- + We add an environment variable `ETCHER_BLACKLISTED_DRIVES` that allows + us to filter certain drives from ever showing up in Etcher with comma + separated device paths, e.g. `/dev/sda,/dev/sdb,/dev/mmcblk0`. + Closes: https://github.com/resin-io/etcher/issues/2264 + Change-Type: patch + Changelog-Entry: Allow blacklisting of drives through and environment + variable ETCHER_BLACKLISTED_DRIVES. + - hash: 9fbf608fadc59b9bda767ea2bb19883bcb08d52b + author: Benedict Aas + footers: + change-type: patch + changelog-entry: Use GTK-3 darkTheme mode. + subject: "feat(GUI): use gtk3 dark theme mode" + body: |- + We enable the `darkTheme` mode for GTK-3 applications (mainly Linux) + that suits Etcher's dark theme better, making the window title bar dark. + - hash: 5eed94a22dc01210257f08b91f03a1ad7fc65b61 + author: Benedict Aas + footers: + closes: https://github.com/resin-io/etcher/issues/2307 + change-type: patch + changelog-entry: Add environment variable to toggle fullscreen. + subject: "feat(GUI): add env var to toggle fullscreen" + body: We add an environment variable to toggle Etcher in fullscreen. + - hash: 1748bf2e2ae4c5241a4ca5047f2238b330290bae + author: Jonas Hermsmeier + footers: + change-type: minor + changelog-entry: Add support for configuration files + subject: "feat(gui): Add ability to read settings from a config file" + body: >- + This adds the capability to configure settings via a `.etcher.json` + file, + + either in the user's home directory, or the current working directory. + + In the case of the home directory, the config file is + `$HOME/.config/etcher/config.json`, + + while on Windows `$HOME/.etcher.json` is used. + + The defined settings are merged with localStorage settings, and + preceding + + configuration files. + + If both are present, the current working directory takes precedence. + - hash: 2045066b1661b0a5fea2b56042ed853ff1852bd9 + author: Benedict Aas + footers: + closes: https://github.com/resin-io/etcher/issues/2263 + change-type: patch + changelog-entry: Show selected drives below drive selection step. + subject: "feat(GUI): show selected drives below drive step" + body: |- + We add a list of selected drives below the drive selection step, able to + accommodate four lines of drives before scrolling occurs. + - hash: 97f878fbc22f218a0313a5837fb9ad48138ea8c5 + author: Benedict Aas + subject: "feat(GUI): env var toggle autoselecting all valid drives" + body: |- + We introduce an environment variable + `ETCHER_DISABLE_EXPLICIT_DRIVE_SELECTION` that both enables + autoselection of drives and disables explicit drive selection by hiding + the buttons allowing this. All valid drives are autoselected, i.e. any + drive-image pair that does not result in an error, however warnings are + accepted. + Closes: https://github.com/resin-io/etcher/issues/2262 + Change-Type: patch + Changelog-Entry: Introduce env var to toggle autoselection of all + drives. + - hash: c00b7b62d6ea2e1213a0b02722f0c364c2622d7d + author: Benedict Aas + footers: + change-type: patch + subject: "minifix: add jsx files to gitattributes and attribute jviotti" + body: null + - hash: 51487125d9e5f9fa94ff952249b3643c17841992 + author: Benedict Aas + footers: + closes: https://github.com/resin-io/etcher/issues/2245 + change-type: patch + changelog-entry: Add a button to cancel the flash process. + subject: "feat(GUI): add button to cancel flash process" + body: |- + We add a cancel button next to the flash progress bar that gracefully + aborts the flash process. + - hash: 702658cca5d5bae496a3ce3bc7b151050cd0daef + author: Benedict Aas + footers: + change-type: patch + subject: "minifix(GUI): negate predicate to show help icon" + body: null + - hash: be478e77cfc0b7544c20383227f4a48813fe2901 + author: Benedict Aas + footers: + connects-to: https://github.com/resin-io/etcher/issues/2263 + closes: https://github.com/resin-io/etcher/issues/2241 + change-type: patch + changelog-entry: Center content independent to window resolution. + subject: "feat(GUI): center content independent to window resolution" + body: |- + We pave way for different sizes of Etcher windows by dynamically + centering the content with flexbox. + - hash: 03c7998c112a661a0d382827b2611839dc29a156 + author: Benedict Aas + footers: + change-type: patch + subject: "feat(GUI): add drive quantity to flash analytics" + body: |- + We add a field `driveCount` to the flash analytics events in the image + writer. + - hash: 6badcefb67192e313d09dccb3f5a07aaf5f1569a + author: Alexis Svinartchouk + footers: + change-type: patch + changelog-entry: Load usbboot adapter on start on GNU/Linux if running as root. + signed-off-by: Alexis Svinartchouk + subject: "fix(sdk): Load usbboot adapter on start" + body: null + - hash: cdc51f4f3f67b2cbb385e9b6617386e560990f84 + author: Benedict Aas + subject: "fix(GUI): fix multi-writes analytics" + body: |- + We make the analytics block into a function `handleErrorLogging` and + use it in the fail event that happens during multi-writes. Previously + error events would be handled when single drives were flashed on Promise + rejection, instead we now only handle the Promise rejection when all + devices fail as a special event. + Change-Type: patch + Changelog-Entry: Fix multi-writes analytics by reusing existing logic in + multi-write events. + - hash: b8897e01932d153c350bfde930a76117c4907d6d + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "feat(writer): Use xxHash instead of SHA512 for verification" + body: |- + This switches from SHA512 to xxHash for verification hashing, + as xxHash provides more throughput. + - hash: 150e8112eaf126733a906f0807e17ccf8941a6ac + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "minifix(writer): Increase HWM for verification readstream" + body: null + - hash: 046ee2c217cb4c075c8bf47416cd842f4d2259d5 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "doc: Update MAINTAINERS.md with Symantec Whitelisting" + body: >- + This adds instructions for submitting Etcher for false positive + detection + + to Symantec Endpoint Protection. + - hash: bb2dac75040554c0ba2c7e50ff9ecd61608e7d38 + author: Benedict Aas + footers: + closes: https://github.com/resin-io/etcher/issues/2247 + change-type: patch + changelog-entry: Allow disabling links and hiding help link with an env var. + subject: "feat(GUI): allow disabling links and hiding help link" + body: |- + We allow users to pass an env var `ETCHER_DISABLE_EXTERNAL_LINKS` to + disable external links and hide links rendered useless by the change + such as the help icon. + - hash: e6ea3879c33058a03914f506a00b3eabbab0c666 + author: Benedict Aas + footers: + change-type: patch + changelog-entry: Add a convenience Storage class on top of localStorage. + subject: "feat(GUI): add convenience localstorage class" + body: |- + We add a class `Storage` and accompanying helper methods that makes + localStorage usage easier. + - hash: 52cc8cb8fc34c437fb5ec0425d69c1075014b83d + author: Benedict Aas + subject: reset getAll on error, use setAll + body: null + - hash: 40df4a94a79cb5a769e04228ac5d59b27370d766 + - hash: 3ee7a43550d1b4c29d3ebd3128388623d78ef8f4 + - hash: 661c1f47c3bd3a49e08e9bb49b15db68a23f1bb7 + - hash: d5514b1aa378799f434f1b6c416c5091b306563a + - hash: 5f85258e84f7ab727d47ea61f8ab690a9279a483 + - hash: abba107e2061caffcb9bd724e6f2f2fd7c455603 + - hash: 6c61292fc650115a527e0dbfbc1eeead5556a09e + - hash: eaf9acf428218aafa6cc59843ead55a178560b26 + - hash: b3776180335901e8bf03ad933f39eb23b9cb6444 + - hash: f0242b89f6ee732e9ece90b69542c242a8569f63 + - hash: 0bc970b217f138842e5253f3ad5f0a72b26bdf41 + - hash: 81387511fe0051fec7ad2aa46df2311be6782b1c + - hash: 26779ef1fb8f5f103338c6effab3b35f18c0606c + - hash: c3b5f8a2abbd213a0a314b7907aa38c1406d696e + - hash: d3a4753b79c84ffefde136b49e5944770047c964 + - hash: 553fbf1a77c1ddc6667038e7ea7e64ce2a6ab21b + - hash: 12cc0de57156037954ec4f96abb4564d6dc4b879 + - hash: 3fad7c26faf4b2a40a74c4cdde943154161b8eea + - hash: df2216df05653ff9bc0b8ddb7d60e5ad73ce1d76 + - hash: e76674a399ba3e82d70efaacc8da9c8cd0bad3bb + - hash: 0bf063f1374913afd1d1366552767b5878a2ff11 + - hash: 84df7497114134cee92715f8afe1bd5b242cf1a4 + - hash: 4c40c8ff30b921c302883db9ae8f267a6d27095d + - hash: 417499134596190eafea1e49f40b807c4883efcf + - hash: 8f762484f29e5f2e28eaa2865f232643bf1cbcf2 +- version: 1.4.4 + date: 2018-04-25T15:36:37.000Z + commits: + - hash: df8bacd82e598339061841d2e5fb051b4eff3928 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(tests): Revert unintended change to raspberrypi-raw.dmg" + body: This file was accidentally changed due to a globally executed search & + replace + - hash: 597c197ffc939f73bf12e71b013d7b9dd230353d + author: Benedict Aas + footers: + change-type: patch + subject: "minifix: replace succeeded with successful in messages and tests" + body: null + - hash: 5a788b04b5698bdd1f2f4eec5100f48bcd271812 + author: Benedict Aas + footers: + fixes: https://github.com/resin-io/etcher/issues/2267 + change-type: patch + changelog-entry: Keep single warning-drive-image pairs selected. + subject: "fix(store): keep single warning-drives selected" + body: |- + We ensure that drive-image pairs with warnings don't get deselected when + there is only one drive available. This happenened because there was no + check for any previous selected devices. Comes with a test case. + - hash: a8bbe02e2114a03f461281b317c7ed0a57ef9c86 + author: Jonas Hermsmeier + subject: v1.4.4 + body: null + - hash: 2d48010af7611dde1f636abfd5c0335679b521b6 + author: Benedict Aas + footers: + change-type: patch + subject: "refactor(GUI): make the finish notification message concise" + body: |- + We make the finish notification message print the device name as usual + when there's one target, and instead list quantity of successful and + failed devices when there are multiple. Previously it would list all + device names, and wouldn't specify how many were successful or failures. + - hash: c4d7076fe816d57581b0f3845a00f173bb13e457 + author: Benedict Aas + footers: + change-type: patch + subject: "refactor: use word successful instead of succeeded" + body: We replace 'succeeded' with 'successful' throughout the codebase. + - hash: 4be1f890d3254b4d4e81f7d8450288020f2e1ba4 + author: Benedict Aas + footers: + change-type: patch + subject: "fix(GUI): remove success screen dots with a quantity of zero" + body: |- + We remove success screen dots that are zero, which mainly means that the + error dot disappears as it shouldn't currently be possible to end up + with zero successful devices on that screen. +- version: 1.4.3 + date: 2018-04-20T13:45:48.000Z + commits: + - hash: 963f1a11eb8994111b860de4c769725f9ff0ec00 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(gui): Fix zero-zero devices when verify is disabled" + body: |- + This fixes a state where the success screen would display + zero succeeded and zero failed devices if verification was + turned off. This could occur due to the "done" event being + emitted before the next progress event could set the relevant data. + - hash: 1d4ea2164f6fdce9b2b36e79b333e417d816da71 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(gui): De-serialize errors from flashResults" + body: null + - hash: b63bb1ac0c5f824aed14fc824367ecec5a00062d + author: Jonas Hermsmeier + subject: v1.4.3 + body: null + - hash: 3bac0225e5a374a833a1ad0da1f62af9b448620b + author: Jonas Hermsmeier + subject: "refactor(usbboot): Move lib/blobs/usbboot/ -> + lib/sdk/adapters/usbboot/blobs" + body: null + - hash: 4c8b97afb3e4032533cfc1cb168d7513ce72ff51 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(usbboot): Move blob handling to SDK" + body: |- + This moves the usbboot blob handling into the SDK to avoid + root dirname conflicts through shimmed __dirname in bundled UI + and different contexts of execution. +- version: 1.4.2 + date: 2018-04-18T21:07:50.000Z + commits: + - hash: 5867edcc70af54b35436525caf13fc6f0c975a85 + author: Jonas Hermsmeier + footers: + change-type: patch + changelog-entry: Revert using native binding to clean disks on Windows + subject: 'Revert "feat(lib): Use win-drive-clean instead of diskpart"' + body: |- + This reverts commit 47fc1b7357bdb9e9aa8e2d7476690435087d984e + in order to prevent a possible regression, until properly investigated + and fixed. + - hash: b3a7255eed41ab825f270bad622d2f8c0b8ae39a + author: Jonas Hermsmeier + footers: + change-type: fix + changelog-entry: Fix usbboot blob loading + subject: "fix(drive-scanner): Fix usbboot blob path when bundled" + body: This fixes the usbboot blobs path when the application is bundled & + packaged. + - hash: 4190a87171b9baa2576c316131ebcb991dc264f4 + author: Jonas Hermsmeier + subject: v1.4.2 + body: null + - hash: c225dd89c66ee812cbc51f4e9d25b9be85828f97 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(image-writer): Remove use of _.isError" + body: >- + `_.isError()` returns `true` for anything that has a `name` and + `message` + + property, causing the check here to always keep the plain object as + error. + - hash: 355373f24df6be0989fad9429c2230166b33a3bf + author: Jonas Hermsmeier + footers: + change-type: patch + changelog-entry: Exclude RAID devices from drive selection list + subject: "fix(adapters): Always ignore RAID attached devices" + body: null + - hash: 1d44eff896737ba0144e8334666cb28de0addfbe + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "upgrade(package): Update drivelist 6.1.5 -> 6.1.7" + body: >- + This fixes a ReferenceError that could occur when the DeviceNode was + null, + + as well as devices being null when run after the system recovers from + sleep / standby. + - hash: 6e7484d3dabc2aeaa7cd471822d7019860cc4a5c + author: Benedict Aas + subject: "feat(GUI): display succeeded and failed devices on finish screen" + body: |- + We display the quantity of succeeded and failed devices using status + dots on the finish screen. + Change-Type: patch + Changelog-Entry: Display succeeded and failed device quantities on the + finish screen. + - hash: ede510139f2efe4f4c76848507e4b0129daac10d + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(ci): Fix pip installation" + body: |- + The pip tarball URL now redirects to another location, which + caused `curl` to fail, as the follow-redirects option wasn't specified. + - hash: 854bd335b6d26ba40534d091fac02313a3e79c48 + author: Benedict Aas + footers: + change-type: patch + subject: "minifeat(GUI): prefix multiple devices label with quantity" + body: |- + Change the `Multiple Devices (n)` label on selected devices to a + quantity-prefixed form `n Devices`. + - hash: cf1dc8681e67161a4a5ebf4500661abe0c99e056 + author: Benedict Aas + footers: + change-type: patch + changelog-entry: Make the progress button blue on verification. + subject: "feat(GUI): make the progress button blue on verification" + body: We make the progress button blue on verification. + - hash: e1ef3de53c0b4b4373b425174976e5f919e876c2 + author: Benedict Aas + footers: + change-type: patch + subject: "feat(GUI): remove unnecessary status dots" + body: |- + We remove usage of the status dots except when failed devices occur, in + which case we still display the red failed dot and quantity. We also use + singular and plural depending on the quantity of failed devices. + - hash: cc848ef9f277723e6ef1e91e482103dec16819df + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(child-writer): Fix handling of user errors over IPC" + body: |- + This fixes transmission of user errors over IPC, as the `report` + property was previously missing. Further it also adds more properties + to `errors.toJSON`, like `syscall`, `errno`, etc. and re-uses the method + for failure signalling. + - hash: d59ebad167392afe689bca0e8cdecb1a38834f05 + author: Benedict Aas + subject: "fix(GUI): display untitled device when device lacks description" + body: |- + We fallback to `'Untitled Device'` when the device lacks a + `.description` field. + Change-Type: patch + Changelog-Entry: Display Untitled Device when the device lacks a + description field. +- version: 1.4.1 + date: 2018-04-10T22:14:22.000Z + commits: + - hash: 741f540f773887c5573aaafff3a2102c22ff7caf + author: Jonas Hermsmeier + subject: v1.4.1 + body: null + - hash: bec61f4ce7388d549d0bebf1bb258cf895a1fad5 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(webpack): Exclude package.json from UI bundle" + body: null + - hash: 8050fa58a53f214ba3958cd1da3e99979ff764a2 + author: John (Jack) Brown + footers: + change-type: patch + subject: Enable nodeGypRebuild for Etcher builds + body: |- + This will ensure we have all bindings built, even when using cached + modules. + - hash: 3906816e67f7cd4722ad95e8f48f6dcd1942b0cb + author: Jonas Hermsmeier + footers: + change-type: none + subject: "doc(README): Remove Mac OS from Travis CI badge label" + body: |- + This removes the "mac" from the Travis CI badge label, as we're not + running Mac OS builds on Travis CI anymore. + - hash: 950f853fa37c99f542dea6dd25e23c1b75d3860b + author: Jonas Hermsmeier + subject: v1.4.0 + body: null +- version: 1.4.0 + date: 2018-04-06T18:59:35.000Z + commits: + - hash: fe43e21484f6356e0709b399d03e8796189d4f61 + author: Jonas Hermsmeier + footers: + change-type: patch + changelog-entry: Display image size for comparison if drive is too small + subject: "feat(gui): Display image size when drive too small" + body: |- + This adds a display of the determined image size to the + drive label when the drive has been determined to be too small. + - hash: 2f872375efd10efd98461cb0a0833da5f6d408a6 + author: 林博仁 + footers: + change-type: minor + changelog-entry: Remove unused robot protocol + signed-off-by: 林博仁 + subject: "docs: Add WoeUSB as an alternative tool to burn Windows USB images" + body: |- + By far WoeUSB is one of the few applications that support Windows image + and runs on GNU/Linux so I assume it is worth to mention it. Additional + line wrapping is made to comply to the code conventions. + - hash: f119ca683e78818ab1ad791f5d11d8c0d4e69ff9 + author: 林博仁(Buo-Ren Lin) + footers: + change-type: minor + signed-off-by: 林博仁 + subject: "docs: Add WoeUSB as an alternative tool to burn Windows USB images(2)" + body: Performing requested change, this commit is supposed to be squashed with + the previous one. + - hash: 176c6b76cdead2ba6cce8145d1a0e98208d567f2 + author: Jonas Hermsmeier + footers: + change-type: patch + changelog-entry: Upgrade eslint to use object-curly-newline options. + subject: Merge branch 'master' into patch-1 + body: null + - hash: 222257d25d6694343d4804f3a84818aeeab4435d + author: Shou + footers: + change-type: patch + changelog-entry: Add drive multi-selection to the store. + subject: "feat: add drive multi-selection in store" + body: |- + We lay the foundation for multi-selecting drives by implementing it into + the `store` and relevant modules interacting with the `store`. + - hash: dd961ad30bd040f658f5e2e78e1e6551cb1acafd + author: Shou + footers: + change-type: patch + changelog-entry: Separate SVG component's path and content attributes. + subject: "feat(GUI): separate svg path and content attributes" + body: |- + We separate the SVG component path and content into attributes + `paths` and `contents` which take lists of strings that are + tried until one succeeds. `contents` takes precedence over `paths`, + i.e. it is tried first. + - hash: f958f3751dc4678511d52d6eb883a859ecdd2954 + author: Jonas Hermsmeier + footers: + change-type: minor + changelog-entry: Use native code to clean drives on Windows + subject: "feat(lib): Use win-drive-clean instead of diskpart" + body: >- + This replaces shelling out to `diskpart` on Windows to clear + + the partition table with `win-drive-clean`, which does so via + DeviceIoControl. + - hash: abf2dc3efcf214a68c0b0e329d57a3f66bb5d342 + author: Benedict Aas + footers: + change-type: patch + subject: "fix: move tabindex attrs to button from within" + body: |- + We move the `tabindex` attributes to the button element directly from + elements contained within the button element – this is to satisfy the + HTML linter. + Changelog-Entry: Move tabindex attributes to button elements from + contained elements. + Change-Type: patch + - hash: 07d6fde34eea42d34084c7fc1274d168e6623008 + author: Benedict Aas + footers: + change-type: patch + changelog-entry: Replace ng-show/hide with ng-if on main page. + subject: "feat(GUI): replace ng-show and ng-hide with ng-if" + body: |- + We replace `ng-show/hide` with `ng-if` on the main page in order to + remove unnecessary calls and become more efficient. + - hash: 90d32197664e19946998c3e7c3dbe6cf43cf7cbf + author: Benedict Aas + footers: + change-type: patch + changelog-entry: Add icon next to drive size when compatibility warnings exist. + subject: "feat: add icon next to drive on warnings" + body: |- + We add an icon next to the drive size that is displayed when there is a + drive-image compatibility status message available. We display the first + one in the list and importance is then enforced by the order they are + added to the list in `drive-constraints`. + - hash: 47aef71dc7e8cc29354a0da71943132865c8c6e0 + author: Benedict Aas + footers: + change-type: patch + changelog-entry: Add spacing to the drive warning icon. + subject: roll back SIZE_NOT_RECOMMENDED change + body: null + - hash: edf924d012d0c9c598448524cbd0fcdd51387c7d + author: Benedict Aas + footers: + change-type: patch + changelog-entry: Log the banner load event to analytics. + subject: "feat: log the event status of the banner" + body: We add log the banner HTTP load event object to the analytics. + - hash: 5e6f7e41e62c16b22dd6956c3482dbe5c9c4e60f + author: Benedict Aas + footers: + change-type: patch + subject: only allow 200 OK statuses + body: null + - hash: 543098cba301030b4e267756fa8c3cb284123a21 + author: Benedict Aas + footers: + change-type: patch + changelog-entry: Replace template paths with template contents. + subject: "feat: replace template paths with contents" + body: |- + We replace the `templateUrl` fields with `template` fields and thus + switch from template paths to template contents in preparation for the + Webpack PR. + - hash: c9a2a47ee184163e6c2841d0c7a8865691bbdcba + author: Benedict Aas + footers: + change-type: patch + subject: test other pages + body: null + - hash: 1f8e09868d1b2fcbd55f6ee71599740241eff538 + author: Benedict Aas + footers: + change-type: patch + subject: test modal + body: null + - hash: bc2ad581baf685797bce901e55628af6635e00fb + author: Benedict Aas + footers: + change-type: patch + subject: pass linter + body: null + - hash: 3498d59258a7002d6e604e79564fcbef383915ad + author: Benedict Aas + footers: + change-type: patch + changelog-entry: Line wrap selector size subtitles wholly + subject: fix sanity-checks + body: null + - hash: f8accd62ed439ce8089af8e837b499bb77b8e720 + author: Jonas Hermsmeier + footers: + change-type: patch + changelog-entry: Hide the size label given multiple devices. + subject: "feat(gui): Add ref params to homepage links in menu" + body: |- + This adds a `ref` param to the URLs in the menu, + in order to see where page views are coming from. + - hash: 57c4a285d8935e040611a156b36fb6e29df5bea7 + author: Jonas Hermsmeier + footers: + change-type: patch + changelog-entry: Inline middle-ellipsis package as util. + subject: "doc(github): Update instructions in ISSUE_TEMPLATE" + body: >- + This updates the instructions to open the Developer Tools in the issue + template, + + as the keyboard shortcuts have changed to their defaults on Linux & + Windows + + from [Ctrl]+[Alt]+[I] to [Ctrl]+[Shift]+[I]. + + Further, the editor config is updated to allow trailing spaces in + Markdown + + files to add trailing spaces to the list items in the issue template, in + + order to avoid people not putting whitespace in between, causing the + formatting + + to not be parsed properly. + - hash: 3dd646485fa34437ac3adb3caa5a594d439f1f68 + author: Rohit Upadhyay + footers: + change-type: patch + changelog-entry: Replace Lodash templates with arrow-functions. + subject: "refactor: replace lodash templates #1810" + body: |- + We replace the lodash templates with arrow-functions and change the + single-argument object into multiple arguments. + - hash: dc484d79edd95e868208d4288048608954fdc5d4 + author: Benedict Aas + footers: + change-type: patch + changelog-entry: Specify UTF-8 encoding with meta tag. + subject: "fix: specify utf-8 encoding with meta tag" + body: |- + We specify the encoding to be UTF-8 with a meta tag such that Electron + won't get confused and try any other encodings. + - hash: 13eb1718aa36d93c1b77944ea2b5aec8a892db4d + author: Benedict Aas + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + changelog-entry: Add `lib/gui/app` folder to ease into Webpack usage. + subject: "feat(GUI): add app to gui folder structure" + body: We add a `lib/gui/app/` folder to help transition to Webpack usage. + - hash: 831c9aee2ac0f9f84780455ab35ea662a4558218 + author: Benedict Aas + footers: + change-type: patch + subject: fix tests + body: null + - hash: dc587031ecef10eeeba74379f99c4ef42cef8781 + author: Benedict Aas + footers: + change-type: patch + changelog-entry: Expose all flash state fields to the store. + subject: remove unnecessary test code + body: null + - hash: 9c1e32d4ba2bb66be3b8b75d7978f37001bee7f0 + author: Benedict Aas + footers: + signed-off-by: Juan Cruz Viotti + change-type: patch + subject: pass linter + body: null + - hash: 25b10490a1be4d616aeeefdd5297dd43757f09bd + author: Jonas Hermsmeier + footers: + change-type: patch + changelog-entry: Fix "Array buffer allocation failed" when flashing some .dmg images + subject: "upgrade(package): Update udif 0.10 -> 0.13" + body: |- + This updates `udif` to 0.13.0: + **v0.13.0:** + - fix(readstream): Use strict mode for compat with Node 4 + - refactor(lib): Improve & fix zerofill streaming + - test: Add passthrough to check for read/push after EOD + - test: Add compression method tests + - feat(udif): Add LZFSE compression type constant + - fix(readstream): Fix passing on readable stream options + **v0.12.0:** + - feat(image): Support use of custom `fs` instances + - feat(readstream): Stream ZEROFILL & FREE blocks + Fixes a buffer allocation failure on large zerofill ranges. + - hash: cd697d72056d273ddd88f27e0d2a35acc56c55f8 + author: Jonas Hermsmeier + footers: + change-type: patch + changelog-entry: Use correct usbboot blob path in AppImages. + subject: "fix(gui): Fix DevTools opening in docked mode" + body: This fixes the Developer Tools opening in docked mode by default. + - hash: f57df3f2c13093684dc27dc658b4dde1c595bd0b + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(gui): Fix menu's application name" + body: >- + This replaces use of `electron.app.getName()` with the package.json's + `.displayName` + + property to ensure the correct application name is displayed when + packaged. + - hash: cf340f48c3582f3e96f7b2dc16c11f44b7661363 + author: Jonas Hermsmeier + footers: + change-type: patch + changelog-entry: Fix status dots to their position. + subject: "upgrade(package): Update yargs 4.7.1 -> 11.0.0" + body: This updates `yargs` to 11.0.0 + - hash: f0e0eaace4feaf577fa237f5e8132794339792c6 + author: Jonas Hermsmeier + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "upgrade(package): Bump debug 2.6.8 -> 3.1.0" + body: This updates `debug` to 3.1.0 due to a RegExp DOS vulnerability. + - hash: 8afc87225201992aa921fadf6605aca6991a618e + author: Juan Cruz Viotti + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "chore: declare Concourse node-cli pipeline's entrypoint" + body: null + - hash: 1d89cf2b757e096475989bf064df87103517f7c3 + author: Juan Cruz Viotti + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "chore: encode complete paths to patched file in patches/" + body: |- + So that the build system doesn't need to know in advance at which + directory the paths needs to be applied. + This will make it easier to add patches support to the Concourse + pipelines. + - hash: 9bb292f38ef860f28a646dec4f1f101801a584d4 + author: Juan Cruz Viotti + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "feat(GUI): bundle the GUI code with Webpack" + body: |- + This commit introduces a Webpack configuration file that bundles the GUI + code along with its dependencies (except the Etcher SDK and its own + dependencies), and uses Babel to add support for JSX (required by the + Rendition library). + The GUI code that goes into the bundle was moved to `lib/gui/app` so we + can easily ignore the whole subdirectory when creating production + distributable packages. + We now have a new make target called `webpack` that can be used to + create the GUI bundle. Such target will be called everytime a package is + generated. + - hash: bcf0d80c4725c83ffe7840ae162d128ebd984225 + author: Benedict Aas + footers: + change-type: patch + subject: fix encoding issue + body: null + - hash: fecccb0b28a923229c6b3bfeb4388f46e148482e + author: Benedict Aas + footers: + change-type: patch + subject: fix writing outside of packages + body: null + - hash: 1862f1905a8314a6322c8c1e2ddab1b4e565e800 + author: Benedict Aas + subject: fix makefile + body: null + - hash: 6647167d02c30e8c9b924fa4a66320e74933fad7 + author: Juan Cruz Viotti + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: Update shrinkwrap file + body: null + - hash: 0da123265c2747ead17f271ada149b3c7251b246 + author: Juan Cruz Viotti + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: Fix shrinkwrap file + body: null + - hash: 9b42960b2fdd3c6a20ff533dce75738c1b2b7333 + author: Benedict Aas + footers: + change-type: patch + subject: remove version ranges + body: null + - hash: 2aa37571f0c1fcc7d6bfc7455c0332b82b3b979f + author: Benedict Aas + footers: + change-type: patch + subject: shrinkwrap + body: null + - hash: 936142cf7e41ec03290cc06c3df1028180964d13 + author: Benedict Aas + footers: + change-type: patch + subject: remove console logs + body: null + - hash: 69c35f7f79229e723035492ba8ce5b567fd082ce + author: Benedict Aas + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: shrinkwrap should see a shrink + body: null + - hash: 9b4e9fea303364ce2dcb9406232c1223534559a3 + author: Benedict Aas + footers: + change-type: patch + changelog-entry: Move the drive selector warning dialog to the flash step. + subject: "feat(GUI): move drive selector warning to flash step" + body: |- + We move the drive selector warning to the flash step, and concatenate + warning messages when more than one needs to be displayed at once. + - hash: 4dd79d338e8e31c3669c8ae869caec9ffd0f3912 + author: Benedict Aas + footers: + change-type: patch + changelog-entry: Replace Helvetica as the main font with Roboto. + subject: "feat(CSS): use roboto font instead of helvetica" + body: We replace Helvetica with Roboto as the main font. + - hash: 79812234702ef07033993924b1e2c6fd2ec4087d + author: Benedict Aas + footers: + fixes: https://github.com/resin-io/etcher/issues/2078 + change-type: patch + changelog-entry: Use SVG contents list in main template. + subject: "minifix: use svg contents list in main template" + body: |- + We use a list instead of element with `svg-icon` in `main.tpl.html`, as + required by the `svg-icon` component and will return an error + otherwise. + - hash: 69e85a7ac657c37475552e31f7733d62dddd6b8c + author: Benedict Aas + subject: "fix: stop autoselecting empty value in store" + body: |- + We fix store autoselection, which selects an empty value when one + drive is selected and then ejected, leaving one drive that is + supposed to be autoselectable. Now it instead properly autoselects the + last drive. + Change-Type: patch + Changelog-Entry: Stop store autoselection from selecting empty values on + drive ejection. + - hash: 82b65399af0f8072a56d1280f948c6173aa28909 + author: Benedict Aas + footers: + change-type: patch + changelog-entry: Remove stale JSON object plainifying in store + subject: "minifix: remove stale json object plainifying in store" + body: null + - hash: 35772b0370e5ad7eb8d7bb25f407e358f8cbfe04 + author: Jonas Hermsmeier + footers: + change-type: minor + subject: "fix(perf): Remove support for CRC32 checksumming" + body: |- + As crc32-stream was identified as a massive performance bottleneck, + we remove it, and default to Node's crypto API with md5 instead. + - hash: 49dd6553fb6e1363dac2546f935790dcbbf8e5d7 + author: Jonas Hermsmeier + subject: "chore(package): Remove crc32-stream dependency" + body: null + - hash: d91d9577774a7a0869d039c29ae95809d5a470f1 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(gui): Disable throttling timers when in background" + body: This disables Electron throttling timers when not in the foreground. + - hash: 804ac8b4dce41deaf5f19f46578b1f9e6b84bf0e + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "upgrade(package): Update resin-cli-visuals to 1.4.1" + body: >- + This updates `resin-cli-visuals` in order to fix drive selection in + + the CLI, which was caused by incompatibility of two different + `drivelist` versions + - hash: bde1e32e29ae75ccecf7fc3bc1b03efd6e4f67b8 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "doc(CONTRIBUTING): Add webpack step to instructions" + body: null + - hash: cb25db2556cd70c06b39ae164304433eaa9268d3 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(image-writer): Fix missing error argv" + body: This fixes a missing error argument being passed in .emit() + - hash: 74d9fcdbbc7e7dd94c32382e3d8ea6d5dd88bf3f + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "upgrade(package): electron-mocha 5.0.0 -> 6.0.0" + body: null + - hash: d12166a87244ed022157d3eb73963b9730b8db2d + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "upgrade(package): mocha 3.2.0 -> 5.0.1" + body: null + - hash: b7ef95f68c28562792b5abe51103f551b1e76324 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "upgrade(package): nock 9.0.9 -> 9.2.3" + body: null + - hash: a392d3b1b456f6a3f9fb70dd5e0ae1c7597ee318 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "upgrade(package): sass-lint 1.10.2 -> 1.12.1" + body: null + - hash: 2604da104d08671742bd4a8b62e07dab1cfb4702 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "upgrade(package): versionist 2.8.1 -> 2.13.0" + body: null + - hash: 544cd96e3dfb07874f0c5e5e8b3c6ad43fd2d2e4 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "upgrade(package): html-angular-validate 0.1.9 -> 0.2.3" + body: null + - hash: 201b8dccaa7603552c7741798c97fb3111e1c4a4 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "upgrade(package): eslint-plugin-node 6.0.0 -> 6.0.1" + body: null + - hash: 55ed4dbc51a0a61f5c23fb2734bac9fe831dbb76 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "upgrade(package): eslint-plugin-jsdoc 3.3.1 -> 3.5.0" + body: null + - hash: 1cc542255790d37329f2bfda63882b4ac37b5f4c + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "upgrade(package): eslint-plugin-import 2.8.0 -> 2.9.0" + body: null + - hash: a12bb4ee7ccc87acfc595ae27ea2a18ed1010595 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "upgrade(package): mochainon 1.0.0 -> 2.0.0" + body: null + - hash: 11a0aa322f277c6cbec1a2ead6b999499d1ee3c2 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "test(available-drives): Fix set expected set property" + body: null + - hash: c11205f3cd90b07fe680284f4866345d7b0f0325 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(shrinkwrap): Fix resolved URL of git repo" + body: null + - hash: bdd05a3f71a764c3ce5dc1dc39e57c83082375f3 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "upgrade(package): Update electron-mocha 6.0.0 -> 6.0.1" + body: See https://github.com/jprichardson/electron-mocha/issues/123 + - hash: 0b306219c1b17f5ce717900e61fd0b439686d6a1 + author: Jonas Hermsmeier + subject: 'Revert "upgrade(package): versionist 2.8.1 -> 2.13.0"' + body: This reverts commit 2604da104d08671742bd4a8b62e07dab1cfb4702. + - hash: 8a70cb59d1a01e9d1063909e02f61fbc0beaa996 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "upgrade(package): Update pkg 4.1.1 -> 4.3.0" + body: null + - hash: 4a3bd5fe7aa290a5175749c987664d994d76d7f2 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "upgrade(package): Update nan 2.3.5 -> 2.9.2" + body: null + - hash: ed18842281bb97a95c1b42ab43f183781d79504c + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "upgrade(package): Update bindings 1.2.1 -> 1.3.0" + body: null + - hash: d116cd7e90b46a80703a0f6ca839b6e057f80de1 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "upgrade(package): Update asar 0.10.0 -> 0.14.2" + body: null + - hash: f02c090b8d36a663a8975fe82bd725e1a66785e6 + author: Jonas Hermsmeier + subject: "fix(package): Fix extraneous dependencies" + body: null + - hash: 401c2c7cc1fd6d2be388032bd0414020fba2bd8d + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "chore(package): Update copyright years" + body: null + - hash: 81b50161682db77c5d3da6ede27a8f1716db15d4 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(webpack): Fix not resolving .json" + body: null + - hash: fcc1f7bc895ff3e403ee1d4b39de0c158fb17c42 + author: Benedict Aas + footers: + change-type: patch + changelog-entry: Move memoize function to shared utils. + subject: "refactor: move memoize function to shared utils" + body: |- + We move the memoize function to `lib/shared/utils.js` and expose it to + modules across the project. + - hash: 0f16435f51a4999e2caeb788fe796233a8d7d362 + author: Andrew Scheller + footers: + change-type: patch + subject: "fix(scripts): Add missing types to architecture-convert.sh usage" + body: null + - hash: c724e4cb20298b99d5c6faed4c7c8f810afb5cf5 + author: Jonas Hermsmeier + footers: + change-type: minor + changelog-entry: Implement writing to multiple destinations simultaneously + subject: "feat(writer): Impl multi-writes in writer modules" + body: Implement writing to multiple destinations simultaneously + - hash: ef634227aac2833241817b1885024b116512bf4e + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "feat(cli): Display number of active cards" + body: null + - hash: 3424b996c83b07a502bb8e84c2d3715c4b266450 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(writer): Fix state verification count" + body: null + - hash: ff5591c77565bcbfacae6aa60248b7f07719918a + author: Benedict Aas + footers: + change-type: patch + changelog-entry: Add missing name param to verifyNoNilFields JSDoc example. + subject: "minifix: add missing parameter to verifyNoNilFields example" + body: |- + We add the missing `name` parameter to the `verifyNoNilFields` JSDoc + example. + - hash: d9ccc43d15109a9d4d0483b637756a960f19c73e + author: Jonas Hermsmeier + footers: + change-type: minor + changelog-entry: Move CLI write preparation logic into SDK + subject: "feat(sdk): Move CLI writer logic into SDK writer" + body: |- + This moves the preparation logic from the CLI into the SDK + in preparation for further SDK rearchitecturing, and to allow + standalone usage of SDK. + - hash: 3e4a234b2420870679108338fbab5e212625e9cb + author: Andrew Scheller + subject: "chore: fixup 'distclean' rule to also delete `generated` directory" + body: "Change-type: patch" + - hash: 4e4b7f8de67e8a3bec38fc824cada7a2ba9c3c7b + author: Juan Cruz Viotti + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "chore: only publish production packages to Bintray" + body: |- + The devel channels will be completely deprecated. The deb/rpm snapshot + builds will still be accessible through GitHub Releases as part of Resin + CI builds. + - hash: e3537e54b8c05eadedd91c367492f2ab1fd75c2a + author: Juan Cruz Viotti + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: 'chore: add "make webpack" as a Concourse build step' + body: We also have to add the generated directory to the final package. + - hash: 8591ff83fd6aa228b516bc0119cf80ce4a0df40f + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(package): Add fsevents to platform specific deps" + body: |- + This adds `fsevents` to the platform specific dependencies, + in order to avoid shrinkwrap disagreements between platforms. + - hash: 53d37404fe5fe65403ec664c4ddbf03f24bbff03 + author: Benedict Aas + footers: + change-type: patch + changelog-entry: Resolve JSX files + subject: "feat: resolve jsx files" + body: |- + We resolve `.jsx` files such that they get handled by babel and bundled + with webpack. + - hash: 9dae1c27236a38cfc4a50c714222f38966a5963b + author: Benedict Aas + subject: "refactor: consolidate store-state nil-checking" + body: |- + We make the nil-checking of store state fields generic through a + `verifyNoNilFields` function that throws an error if any fields are + nil. + Change-Type: patch + Changelog-Entry: Consolidate store state nil-checking with helper + function. + - hash: 4310981c8969ef5d5b5bfa1311c741c2b77909e2 + author: Benedict Aas + footers: + change-type: patch + changelog-entry: Make all `.label` tags' text bold and remove need for `` tags. + subject: "fix(GUI): make all class label text bold" + body: |- + We make all tags with `.label` have bold text and remove the need for + `` tags. + - hash: 9c59ecf1950b4dc60566c6f1e593e6eedb7c1693 + author: Benedict Aas + footers: + change-type: patch + changelog-entry: Add spacing to the drive-selector warning/error labels. + subject: "feat(GUI): add spacing to drive-selector labels" + body: |- + We add a right margin to the drive-selector labels so they look nicer + when there are multiple. + - hash: 2b66762dec7fa62514cf0a62b42a2b760300c100 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(app): Fix enabling debug output" + body: This fixes enabling debug output via the DEBUG env var + - hash: 7063f254c6a352b5ecaf291e58a5f51298a58789 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(cli): Remove O_DIRECT & O_EXCL" + body: |- + This removes O_DIRECT and O_EXCL flags from the writer, + as O_DIRECT can lead to EINVAL under quite a few circumstances, + and O_EXCL has proven to be useless. + - hash: b0538099cf38bc30247f4f58eb5e1da3dd17f599 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(lib): Fix debug namespaces" + body: |- + This fixes some debug namespaces not being prefixed with `etcher:` + and their respective subsystems. + - hash: 7c9f15d8a9c4c213168657f5af488ad243ccb1dc + author: Jonas Hermsmeier + footers: + change-type: minor + changelog-entry: Consolidate low-level components into Etcher SDK + subject: "feat(sdk): Consolidate low-level components into SDK" + body: |- + Changes: + - Split out scanner into own file + - Move `lib/shared/sdk` -> `lib/sdk` + - Move `lib/image-stream` -> `lib/sdk/image-stream` + - Move `lib/writer` -> `lib/sdk/writer` + - Rename `sdk/standard` -> `sdk/blockdevice` + - Move adapters into `sdk/adapters` subdirectory + - hash: 94ed9d70124171e965219b47c35774bdc1caff14 + author: Benedict Aas + footers: + change-type: patch + changelog-entry: Remove stale `invalidKey` check in store. + subject: "refactor: remove stale invalid key check in store" + body: >- + We remove a piece of code checking whether `_.keys` returns any + non-string + + values in its array, but per the Lodash documentation `_.keys` always + returns an + + array of strings. + - hash: 83528df18be32bfe62d3e9e4578101077769a7cf + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "upgrade(package): Update node-sass 4.5.3 -> 4.7.2" + body: null + - hash: 38310751b67a2d86a6eedd1f8108993559281a05 + author: Benedict Aas + footers: + fixes: https://github.com/resin-io/etcher/issues/1916 + change-type: patch + changelog-entry: Warn the user on selection of large drives. + subject: "feat(GUI): warn the user on large drive selection" + body: |- + We warn the user when they select a large drive to confirm they want to + flash in case the device is important. + - hash: 57d23535965384461175918432a08b67cb18187f + author: Benedict Aas + footers: + change-type: patch + changelog-entry: Make the drive-selector button orange on warnings. + subject: "feat(GUI): warning makes drive-selector button orange" + body: >- + We make the drive-selector button orange when there is a warning + attached + + to the image-drive pair. + - hash: 4ce89f97fe02d714ce7f247a6a03ad6d326c3a8a + author: Benedict Aas + subject: "refactor(GUI): remove selection-state clear options to simplify" + body: |- + We refactor and simplify the selection-state `.clear()` by removing the + options argument. + Change-Type: patch + Changelog-Entry: Remove `selectionState.clear()` options argument to + simplify. + - hash: 6990d7632a946d038cae75df3435d6f2754a9743 + author: Jonas Hermsmeier + footers: + change-type: patch + changelog-entry: Support building Etcher on armv8 + subject: "fix(Makefile): Support arm64 / armv8 / aarch64" + body: This adds support for 64bit arm cpu architectures. + - hash: fbb175608dc13f1295af169ccb46e2f476d36d19 + author: Jonas Hermsmeier + footers: + change-type: patch + changelog-entry: Increase UV_THREADPOOL_SIZE to allocate 4 threads per CPU + subject: "feat(writer): Increase UV_THREADPOOL_SIZE" + body: |- + This increases the UV_THREADPOOL_SIZE to CPUs * 4 to + facilitate full write speeds when writing to multiple destinations, + in preparation for integrating multi-writes. + - hash: 605392522f058f14b551720483313c46866f6b2e + author: Benedict Aas + footers: + change-type: patch + changelog-entry: Rename selection-state and store functions. + subject: "refactor: rename selection state and store functions" + body: We rename functions in `selection-state` and the `store`. + - hash: eb0f52cddc6b6a3c5b5cfb869715db4aebeadff9 + author: Benedict Aas + subject: unselect -> deselect + body: null + - hash: d50bc92909dcb2c2ca46994ba2956b5fb6e55762 + author: Benedict Aas + subject: "feat(GUI): add descriptive name to modals" + body: |- + We add a descriptive name to modals for analytics and debugging. + Change-Type: patch + Changelog-Entry: Add descriptive name to modals for analytics and + debugging. + - hash: 7a0d385e12332d33e83941c87c9c8a12ce7cda4f + author: Benedict Aas + subject: log name in resolve/reject/error + body: null + - hash: 04352494a05eefca54d6a8655ecc9be4ea568403 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "test: Remove unnecessary `file-exists` dependency" + body: null + - hash: 0bc09defa7f347168d60d84c9476752be9c638ca + author: Jonas Hermsmeier + subject: "chore(package): Remove unused dependency `trackjs`" + body: null + - hash: ab026b1635e21fa416faa92b8bcfa0d1be5317b4 + author: Jonas Hermsmeier + subject: "test(image-stream): Fix lint error in tester" + body: null + - hash: 76f537a636171508ace9ac2ae1159d568837e425 + - hash: fdd0d781ca206556f27a7cbfae15b0c7bcee3584 + - hash: 5634954b7e5ad9150994c6ea3a20cc573222f4a4 + - hash: 39ea2b96c9aa0ee2c64447ba3661dd98323a4fd2 + - hash: f3c9d9b85336fb9b49674ed81cb10af278f7d1b1 + - hash: 504826051c4c99bccdd11e054ba4ab17ccdc2c6b + - hash: 47fc1b7357bdb9e9aa8e2d7476690435087d984e + - hash: 76a05d2dc9e996cddff5b15ed65d9f6cf9142f58 + - hash: e769ef7d0bac50b438e483e7a15a1e68e0f85b4f + - hash: 56d408c195d3760b44e84e5c9249e48b2332b9e4 + - hash: f756c965fcdd3c99098c4daef88a6f04f8054164 + - hash: 4869f1f97cbc960caf869e974d7e31db103c3094 + - hash: 8a92810a69c9f9e59992e4d434714a252045e316 + - hash: db2bed896a064d4d78383a7f7635896ca58b0a4b + - hash: f2424095e034e0bfef1bed04d8ee03a4e41adc1b + - hash: ad0b5e758311de5938375b390f9ba4f7584b6d8b + - hash: d5a14031c63e6c7d4c5eba793b2e53c4e21596cf + - hash: 96c76177af6f37f088708722799042d961c34180 + - hash: 5754b4c6af79bc96553e950700d465b8290c2d31 + - hash: f6bfdb2ced96e8e91f1fadf7dda8aed6f4f38179 + - hash: b83e06ca809d99431f6228ab065c897d4b05174b + - hash: c054642f24e48dd02f09b0b0780910c5a7811866 + - hash: 20bc08630322bec539d926507191dd29ab27b813 + - hash: 514c8ec665b248dca5cb84365be834da72a13367 + - hash: 3e6c68728e9c894d4a0351256add4b3ec9a0aff8 + - hash: 2fc961db2868f365b176cd33584ff8f80299b25b + - hash: d01b73a66160b124949976dce7db21c63cfc4ac1 + - hash: a5aaf760d0613d92934481ae6b5693da383bd05c + - hash: 72ca73e42981d79e2167612195d0ab969fcb10b0 + - hash: fb19facbe5c3d9c1241a6f6301cb72b3144171d0 + - hash: 92019ae6977963eab0878dac95ed31109078437b + - hash: 2dbdbbe3a30fdfa2f45a20a1209d8ab6d57d3764 + - hash: 40fe3392be09799a03b8a724fef7e3bead1bb0d8 + - hash: 90cfbe6dc34756c23fc1b091fa5d943259e48118 + - hash: 1225b23b4029ac185577cee4811bcac36560ba59 + - hash: 48e3fbae5db397bb6500817281e9f72a55f27518 + - hash: 3634927ae55065391b20e418e7dd1217ebb07df3 + - hash: 948283154ac905faf18abd74c1486388294013c9 + - hash: 477257b46dc7ad8ad0e7bc4815c3745d473640d7 + - hash: a356f023fe8ca5b6ee679442d1d91f5b76620b05 + - hash: fac77420b22864859dda748d754a6ffbfd1a63de + - hash: 50c88a1422431b3bb0dba58231ec84ff31f1a081 + - hash: 6dd9d8d69006155c59d6688d42a27a1f83705a5c + - hash: 15647eee97f7afd7700445d9b02815e1f7a50e57 + - hash: 4108979b653a57a03149c8590d1d9b79689c928a + - hash: 737b3be5beb645a4d0661adbe63e993c51c2c3ad + - hash: 3249af4eaa92d18f8fe088b2f04de22775f71067 + - hash: 974315868d081bcd92f4c602aaa1491727d8ee86 + - hash: a7f974ba5c932f6c10ed7319c3c5e7a8fd83c178 + - hash: 1b56fea16685103b3cbd465f7cf3a8abcb50b7c3 +- version: 1.3.1 + date: 2018-01-23T14:30:07.000Z + commits: + - hash: 6bf0e33ab2fae1287aecd8077608419db3c02358 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(lib): Fix readonly property typo" + body: |- + This fixes the camelcasing of the `.isReadOnly` property + of detected storage devices. + - hash: decfddf0084cfca31f7ba11d04bdea70a31c09e8 + author: Jonas Hermsmeier + footers: + see: https://electronjs.org/blog/protocol-handler-fix + change-type: patch + changelog-entry: Update Electron to v1.7.11 + subject: "upgrade(package): Update electron 1.7.10 -> 1.7.11" + body: This updates Electron to v1.7.11, mitigating CVE-2018-1000006. + - hash: 731bca98eb09b658f86989cc97cf3801dd105556 + author: Jonas Hermsmeier + subject: v1.3.1 + body: null + - hash: 7c67adcbc23eefff17a3f9ba5aaa52665c5e6aeb + author: Jonas Hermsmeier + footers: + change-type: patch + changelog-entry: Fix incomplete unmounts after flashing on Linux + subject: "upgrade(package): Bump mountutils 1.3.8 -> 1.3.10" + body: |- + This updates `mountutils` from 1.3.8 -> 1.3.10; + - fix(linux): Fix partial unmounts on Linux + - fix(windows): Link to appropriate libraries + - hash: 25573ce2fe937a67dc696b8766c22c611754b9b3 + author: Juan Cruz Viotti + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "chore: stop testing macOS on Travis CI" + body: We will rely on our Concourse instance for that. + - hash: e2f99046a8441b8f1d75bc8917d15ac4ce561f5d + author: Juan Cruz Viotti + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "chore: add node-cli.node Resin CI option" + body: |- + This represents the Node.js version that will be used to compile the + Etcher CLI. + - hash: 92ab18b399f7b9d60bb00dd935495c1b83f3f26e + author: Juan Cruz Viotti + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "chore: revise Concourse CI related npm scripts" + body: |- + - The `concourse-dependencies` and `concourse-build-installers` scripts + are not necessary anymore, given that the Electron pipeline already + knows how to perform these tasks + - The `concourse-test` script will be renamed to + `concourse-test-electron` to include the pipeline name (electron), so a + single project can be served by more than one pipeline. I'll keep the + old `concourse-test` for a bit for backwards compatibility until all + Etcher PRs are rebased + - There is a new `concourse-test-node-cli` script that will be used by + the Node.js CLI pipeline + - There is a new `test-cli` target that is supposed to host CLI tests. + For now, it just runs the SDK tests in a Node.js environment (instead of + in Electron) + - hash: 716cc2cfe4b94aef1bcdd9e7366e88fbd52fe995 + author: Jonas Hermsmeier + footers: + change-type: patch + changelog-entry: Fix selection of images in folders with file extension on Mac OS + subject: "fix(gui): Allow selection of images in folders with extension" + body: >- + This fixes selection of images contained in directories with a file + extension + + (i.e. "openSUSE-Leap-42.3-DVD-x86_64.iso") in the open file dialog. + - hash: 6680aaaf41d4fffb75ca93282c09e3b9bdff693b + author: Jonas Hermsmeier + footers: + change-type: patch + changelog-entry: Fix Etcher not working / crashing on older Windows systems + subject: "upgrade(package): Bump drivelist 6.0.0 -> 6.0.4" + body: |- + This updates `drivelist` to v6.0.4, fixing a crash on Windows 7, + among other things: + - Fix(windows): Impl IsSystemDevice() + - Fix crash on Windows 7 + - Fix(darwin): Use proper flag to enable extended regexes in `sed` + - Fix(darwin): Allow mountpoints containing space characters + - hash: 087b28669d0b3caaef70cabaefc8afa6c735efb1 + author: Juan Cruz Viotti + footers: + see: https://github.com/jprichardson/electron-mocha/issues/119 + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "upgrade: `electron-mocha` to v5.0.0" + body: |- + Looks like this will fix an issue where the `electron-mocha` main + process fails with an EPERM error on Windows, which we've been + experiencing on our Concourse setup. + - hash: ff2c65e70683884a1a0b5b0ef0a0cdeeaa1f0373 + author: Jonas Hermsmeier + footers: + change-type: patch + changelog-entry: Fix "The specified module could not be found" on Windows + subject: "fix(usb): Ignore errors if winusb doesn't load" + body: >- + Due to some Windows systems missing certain C runtime libraries + + (Visual C/C++ 2012 / 2015 Redistributables), we ignore errors when + loading + + this module until we can ensure distribution of those along with it. + - hash: 21e595466d5d950d7c38b2411791f756ec6ebdca + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(shrinkwrap): Update unbzip2-stream branch commit" + body: |- + The shrinkwrap still contained the commit hash of a commit + previous to an npm install bugfix + - hash: 8beb24f3f07eab3bee8f901e273f47565f3504b1 + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + subject: "chore: add .resinci.json builder configuration object" + body: |- + This object will eventually replace the `electron-builder.yml` file + that's currently present in the root of the project. + For now, it contains the `electron-builder` options that are project + specific (all the generic bits live in the Electron Concourse pipeline), + but in the future we might want to decouple how users configure packages + from the `electron-builder` project, instead making the user provide + Resin Concourse specific options that are then translated to + `electron-builder` (or any other packaging technology we might decide to + use) under the hood. + Change-Type: patch + Signed-off-by: Juan Cruz Viotti + Trigger Concourse CI + - hash: d172d564bbac208ee863b84a7fae4d6f65c78831 + author: Benedict Aas + footers: + changelog-entry: Test that IPC verbosity is off + change-type: patch + subject: "feat: test that ipc verbosity is off" + body: |- + We test that `ipc.config.silent` is set to `true` so that it doesn't + spam `stdout` for users. + - hash: 628e6bc3ca0ead91b742ee05bd00e005ae11c874 + author: Benedict Aas + subject: disable eslint no-unused-vars for imports + body: null + - hash: 2354a921db32add1d3346f49a855f6cb03742309 + author: Benedict Aas + subject: fix image-writer test + body: null + - hash: 0ddc4c505934ae343d9f0bdbce56739f750bc5c4 + author: Benedict Aas + subject: remove eslint disable line in image-writer test + body: null + - hash: 53c0d50028eda5bf7bd4255afc1bfd343d3f53f5 + author: Benedict Aas + subject: use existing image-writer spec, append spec to child-writer test file + body: null + - hash: dbccded8ed0e936fd36a8def8ab648dc8faee646 + author: Benedict Aas + subject: remove const + body: null + - hash: a1becbf15fa355eab2a5fca23aef1b7d27100455 + author: Jonas Hermsmeier + subject: "fix(writer): Silence IPC output on stdout" + body: |- + This was causing the stdout maxBuffer size to be exceeded + when flashing larger images (or having flashes that took a while). + Change-Type: patch + Changlog Entry: Fix "stdout maxBuffer exceeded" error on Linux + - hash: 1d85d122eb980afe42bd9c26ae06b2e6b4b97a38 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "doc(MAINTAINERS): Elaborate on the process of releasing" + body: |- + This updates the maintainers' doc with a little more detail + regarding the release process, to avoid it staying tribal knowledge. +- version: 1.3.0 + date: 2018-01-05T21:09:41.000Z + commits: + - hash: ece9a5666ee5fff52816e590d93fec3a24982402 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "refactor(scripts): Update clean-shrinkwrap script" + body: >- + This updates the `postshrinkwrap` script to traverse the dependency tree + + and remove all `from` fields to avoid inconsistent diffs across + platforms, + + environments and installs when shrinkwrapping anew. + - hash: 619051a4b0cd8995e31838f221386b9b44e6ffc8 + author: Jonas Hermsmeier + subject: "chore(shrinkwrap): Update npm-shrinkwrap.json" + body: null + - hash: fa1c98932371f110541afb5a7994415699850c7d + author: Jonas Hermsmeier + subject: "fix(scripts): Ensure `resolved` field in shrinkwrap is HTTPS" + body: null + - hash: 4c3575b46312bd84401f40472c7ad6c64e5b09c2 + author: Jonas Hermsmeier + subject: 'fix(scripts): Only strip "from" of registry packages' + body: null + - hash: 98f19e0cba7bf7ce2885a33f6ed7bb75c1066bca + author: Jonas Hermsmeier + subject: "fix(clean-shrinkwrap): Fix linter errors" + body: null + - hash: 929a3aa1830654930e08ba754134e5a8553136a8 + author: Jonas Hermsmeier + subject: "chore(shrinkwrap): Update npm-shrinkwrap.json" + body: null + - hash: e98c91dd3c6c1d8ca8408acaacf5a9eb8498f6bf + author: Andrew Scheller + footers: + change-type: patch + see: https://github.com/resin-io/etcher/pull/1941 + signed-off-by: Juan Cruz Viotti + subject: "fix(scripts): fix spelling typo" + body: null + - hash: 766a4088cc4d71c31b0590ab3db9f2d9e563a399 + author: Shou + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + changelog-entry: Remove Angular dependency from image-writer. + subject: "feat(GUI): remove angular from image-writer" + body: |- + We remove Angular from the `image-writer` module by using Redux store + updates, subscribing to them while flashing. + - hash: ce104fe43cb0b64be289d69c7357776de48dc80f + author: Shou + footers: + change-type: patch + changelog-entry: Fix trailing space in environment variables during Windows elevation. + signed-off-by: Juan Cruz Viotti + subject: remove old references + body: null + - hash: 1395fe91d686382c41d20faaa7cba7568f7f247b + author: Shou + footers: + change-type: patch + subject: use fat arrows instead of functions + body: null + - hash: 90f118ebbf485d89e807e47aad2f0054cbaf2732 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "upgrade(package): Bump mountutils 1.2.2 -> 1.3.8" + body: null + - hash: 118a91016e7579ee134836184121885e3553c2a5 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "upgrade(package): Bump drivelist 5.2.4 -> 5.2.12" + body: null + - hash: 21a95d4fcf17d47264efdd40c9e72a8f4927e2dd + author: Juan Cruz Viotti + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "chore: re-organize files inside assets/" + body: |- + This is the file convention that Resin Concourse will use. I flattened + the directory for simplicity. + - hash: 6410f8ed57032805c7d281887575e941dc25efd6 + author: Juan Cruz Viotti + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "chore: move updates disabling logic out of the Makefile" + body: |- + The Makefile current has logic to disable updates when building deb or + rpm packages. To make the Concourse pipeline transition easier, the + logic that disables updates on deb and rpm has been moved to the main + application code. + - hash: 670e6a0fd2f90ff35c46dd849a019027f1b9f0e7 + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + subject: "chore: declare Concourse dependencies in package.json" + body: Resin Concourse will make sure to provide these during build time. + - hash: 756b2e61b75499006f390e4b26dad4db067cc892 + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + subject: "chore: make `test` npm script run everything we run on the CI services" + body: |- + The idea is that the `test` command will replace the recently introduced + `concourse-test` script. + `concourse-test` will become simply a call to `test` for now to ensure + backwards compatibility while we update Resin Concourse. + - hash: 9c87e1ff635acfe2c1b18615fc945f7a633ab336 + author: Juan Cruz Viotti + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "chore: add Concourse related NPM scripts" + body: |- + Our Electron Concourse pipeline is completely independent from the + application its testing (ie we can apply it to any other Electron app we + build with ease). + In order to keep such genericity, the application under test should + provide certain npm scripts that tell Concourse how to do specific tasks + on the repo, like install dependencies, in a build-system independent + fashion. + - hash: 9bce6bc30ae3cb67301b1a7fb91e734ab45d7118 + author: Juan Cruz Viotti + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "chore: get rid of npx" + body: |- + We can live without it with a simple `PATH` trick at the top of the + Makefile (thanks @lurch!). + - hash: 2644f8fb450e885c86ecb61b273f8041bab2a98e + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(package): Fix noodled merge of shrinkwrap file" + body: |- + Out of order squash merging resulted in some from-lines + not being removed in the npm-shrinkwrap. + - hash: 384c74714ab9dc88bc0bae5cecfc04bed6b1a5f3 + author: Jonas Hermsmeier + footers: + change-type: minor + subject: "feat(writer): Add read/write retry delays" + body: null + - hash: b0b815021d712dab65514355d1d10e9aa1cb8e10 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(writer): Add EBUSY to transient errors on Linux" + body: null + - hash: 80f4fc11bdbf23029609cad07456e50d95442241 + author: Juan Cruz Viotti + footers: + change-type: patch + changelog-entry: Don't send analytics events when attempting to toggle a disabled drive. + signed-off-by: Juan Cruz Viotti + subject: "fix(GUI): only emit toggle drive event if drive is selectable" + body: |- + Right now we emit "Toggle drive" analytics events even when clicking on + disable/unselectable drives. + The fix is to move the `analytics.logEvent` inside the code path that + applies if a drive selection is considered valid. + - hash: 9e37223652a722c0074649c745c44ca1e2de53bf + author: Juan Cruz Viotti + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "chore(appveyor): build x86 on real x86 machines" + body: |- + We do this by using Appveyor's `platform` configuration variable instead + of always running on x64 and cross-compiling to x86. + - hash: c48b17653492dc11da1b56d7e284634bde56df49 + author: Juan Cruz Viotti + footers: + change-type: patch + changelog-entry: Ensure the writer process dies when the GUI application is killed. + see: https://github.com/resin-io/etcher/pull/1843 + signed-off-by: Juan Cruz Viotti + subject: "refactor(GUI): remove the intermediate child writer proxy process" + body: |- + Etcher currently elevates a child writer proxy that itself spawns the + Etcher CLI in robot mode, parses the output, and proxies those messages + to the GUI application over IPC. + After these set of changes, Etcher elevates a single child writer + process that directly communicates back with the GUI using IPC. The main + purpose behind these changes is to simplify the overall architecture and + fix various issues caused by the current complex child process tree. + Here's a summary of the changes: + - Stop wrapping the Etcher CLI to perform writing + - Remove the robot option from the Etcher CLI (along with related + documentation) + - Elevate a new `child-write.js` standalone executable + - Move the relevant bits of `lib/child-writer` to the `image-writer` GUI + module + - Remove the `lib/child-writer` directory + - Add a new "Child died unexpectedly" Mixpanel event + - Floor state percentage in the flash state model + The above changes made is possible to tackle all the remaining issues + where the writer process would remain alive even if the parent died. + - hash: d769f7e9f5fe1e80df90f166be869cbca8bbc424 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "upgrade(package): Bump electron-builder 19.9.1 -> 19.47.1" + body: null + - hash: 5c9a22200771ce06d9541e05baf19d8a8aba95bf + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "refactor(electron-builder): Update configuration & icon asset" + body: null + - hash: 837054ca9457149e3e2506900db30f85e3d63cee + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(dockerfile): Add tar/fpm/electron-builder workaround" + body: null + - hash: 4174acc03970c7864046f7bedea60266407b3612 + author: Jonas Hermsmeier + subject: "fix(electron-builder): Add full icon set for Linux" + body: null + - hash: 3a61420dc7f13435cb6f9e937baf1db61751bf3d + author: Jonas Hermsmeier + subject: "fix(dockerfile): Add missing apt update" + body: null + - hash: 2e310285f63a4fc9ec164194b2006cdc3e801a1e + author: Jonas Hermsmeier + subject: "fix(dockerfile): Re-order wheezy workaround" + body: null + - hash: c35a2141f0e340c1b79d36b86daaddaedcceab03 + author: Jonas Hermsmeier + subject: "fix(package): Fix shrinkwrap file" + body: null + - hash: 64a5ab2aa77fff91a0a6a0de2952bb34722335c5 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(package): Downgrade to electron-builder@19.40.0" + body: null + - hash: b7ef95a39a0c877470f87e91b349d43f96e05faf + author: Juan Cruz Viotti + footers: + change-type: minor + changelog-entry: Display connected Compute Modules even if Windows doesn't have + the necessary drivers to act on them. + signed-off-by: Juan Cruz Viotti + subject: "feat(SDK): display Compute Modules even if host OS has no drivers" + body: |- + This is the first step towards full usbboot Windows support. The driver + selector dialog will now display disabled devices to represent Compute + Modules even when Windows drivers are not installed to act on them. + These drives will state "Missing drivers." + - hash: 4d4fd8105984d0ac7f03f3aa2b389fe1c64246cd + author: Jonas Hermsmeier + footers: + change-type: patch + changelog-entry: Fix disabled native OS window shortcuts + subject: "fix(gui): Re-enable application menu" + body: |- + This re-enables the application menu to allow for OS native shortcuts + to work again (i.e. hide/minimize window), which also allows us to + get rid of the global-shortcuts hack to prevent window reloads. + - hash: 9a6680042b947e66858509bb6535c969f8d53147 + author: Jonas Hermsmeier + subject: "refactor(gui): Update kbd shortcut comment to be less specific" + body: null + - hash: bbd34cd76adab1fb7b0bdb989b73b0054ecd5bbf + author: Juan Cruz Viotti + footers: + fixes: https://github.com/resin-io/etcher/issues/1870 + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "chore: setup a Spectron integration test suite" + body: |- + - Add a `make test-spectron` target + - Install `spectron` and `mocha` (since we don't need to run the tests + inside an Electron instance like in the case of `electron-mocha`) + - Add some example tests + - hash: 383263d97a2df04850ac3809aeeb8c6ef5b85d37 + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + subject: "docs: add high level manual testing script" + body: null + - hash: 1e7d1471ed989b2eb28087d64bfa13a2d181f912 + - hash: 59ad60a3f8bf70c21f43665df74882bef67c27b9 + - hash: 4e2bc2cdf83b91bcced13ca9d2d56e48b1c721bb + - hash: 79d6c5a379d964a99c43a4f08cbad720fb529da9 + - hash: 40aaa31d29f3298ad77e37a7b8263b3f23220167 + - hash: f8fc0e5aa6e3f15c453a65279aa5efa01bf738aa + - hash: 8cfc0764187050fc3b9aa194f79a3359ee8a6bfe + - hash: 24d228bd35dd75fcfdc6663ab7e0da896784bbdc + - hash: ff9a1595cf0e4cfcbe82a5839e1b6634d318eae4 + - hash: c671773ff0086c9f35e741cd2e3fd8853abddab8 +- version: 1.2.1 + date: 2017-12-07T15:43:58.000Z + commits: + - hash: 7c9aa6dc909a6308e664f6d4364634c44a205b83 + author: Shou + subject: "feat(GUI): add progress and status to window title" + body: |- + We add the progress percentage to the window alongside the status + (validating, flashing). + footers: + signed-off-by: Juan Cruz Viotti + closes: https://github.com/resin-io/etcher/issues/1427 + fixes: https://github.com/resin-io/etcher/issues/1439 + changelog-entry: Add the progress and status to the window title. + - hash: 590b0094a49b4fbfbb47640072d834245089cbf1 + author: Shou + footers: + see: https://github.com/resin-io/etcher/issues/1772 + signed-off-by: Juan Cruz Viotti + change-type: patch + subject: only call .getFlashState if necessary + body: null + - hash: 2a47b4e0ce7efc88c6bf7758df85bb5521e1502b + author: Benedict Aas + subject: remove list usage for string concat + body: null + footers: + change-type: patch + changelog-entry: Add the Python version (2.7) to the CONTRIBUTING doc. + - hash: 6187b8501a56638520f7f763254b9556192dd770 + author: Benedict Aas + footers: + change-type: patch + subject: makeTitle -> getWindowTitle, and takes nil param + body: null + - hash: ec420544769978e99c17420f5c29e02467e39b1a + author: Benedict Aas + footers: + change-type: patch + changelog-entry: Remove duplicate debug enabling in usbboot module. + subject: "minifix: remove duplicate debug enable in usbboot" + body: null + - hash: 7b30dfbdb6135dc3ea08605d1658f429401aa02c + author: Jonas Hermsmeier + footers: + change-type: patch + changelog-entry: Don't send initial Mixpanel events before "Anonymous Tracking" + settings are loaded. + fixes: https://github.com/resin-io/etcher/issues/1772 + signed-off-by: Juan Cruz Viotti + subject: "fix(sdk): Remove event listeners on unsubscribe" + body: null + - hash: bf41594ab9b1fcdf08d254cfc97849849fdeb39e + author: Andrew Scheller + footers: + change-type: patch + changelog-entry: Fix verification step reading from the cache + subject: "fix: Correct image.size usage in tests and code-comments" + body: image.size is always an object, never a plain number + - hash: f4635b8e22fdba88898722ef5bbabc3ef6e75465 + author: Jonas Hermsmeier + footers: + change-type: Patch + subject: 'fix(sdk): Correct "subscribe" typos' + body: null + - hash: 6404c997cc9dafa8e4c7e6e477cf32cc2ea53d79 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "test(dictionary): Add subsribe -> subscribe" + body: null + - hash: 7cf8dff27b61e84060bd79272f39032b16bcadbb + author: Benedict Aas + footers: + change-type: minor + reverts: https://github.com/resin-io/etcher/pull/1708 + see: https://github.com/resin-io/etcher/issues/1819 + changelog-entry: Remove Linux elevation meant for usbboot. + subject: "fix: rid linux startup elevation" + body: We remove the Linux elevation meant for usbboot device access. + - hash: 02e1ac20e39f1a5a2b2bbc6e7be43a7d3288f36d + author: Benedict Aas + footers: + change-type: minor + changelog-entry: Display actual write speed + subject: complete revert + body: null + - hash: c0b7acfcccde1e60347d7c2da6bfd6f90281f75d + author: Benedict Aas + footers: + change-type: patch + changelog-entry: Fix bzip2 streaming with the new pipelines + subject: use sdk unsubscribe, .name -> .id + body: null + - hash: 8c4c84e8cd70405144c9ab120126a0ffbd3fd3ce + author: Benedict Aas + footers: + change-type: patch + subject: remove warning + body: null + - hash: 9ae161b054e245a39cdc73d4718522b1a7f468a0 + author: Sven Dowideit + footers: + change-type: patch + signed-off-by: Sven Dowideit + subject: "docs: etcher-image-stream was moved to the main etcher repo" + body: null + - hash: 0431786194bc9d11fa3621b14dac9a5773de9e0d + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(gui): Don't check elevation on start on Windows" + body: null + - hash: 65e44cb610d029d6a354a0c7ffb5a2fb8d948c14 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(scripts): Fix pip install in docker" + body: >- + This works around the "Cannot fetch index base URL + http://pypi.python.org/simple/" + + error by installing pip==9.0.1 directly from the + pypi.python.org/packages/ + - hash: c8b2b652354029cedceda2637bed13fee65f8587 + author: Juan Cruz Viotti + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "fix(usbboot): increase device reboot delay a little bit" + body: null + - hash: 61dce0aca9d706a7e5ba453578ab69d572381807 + author: Jonas Hermsmeier + footers: + change-type: minor + subject: "feat(sdk): Implement continuous scanning" + body: |- + This implements an SDK.Scanner which handles any given + adapters and manages the scans. This change enables continuous + scanning without the need to `.scan()` scheduling in other places. + - hash: 07473a0f213ff5af95754a40106cc64d17e623d3 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "test(Makefile): Update codespell excludes" + body: >- + This adds excludes for .dtb, .dtbo, .dat, .elf, .bin, .foo, and + xz-without-extension + + to reduce unnecessary warning output in `make lint`. + + ``` + + WARNING: Binary file: lib/blobs/usbboot/bcm2709-rpi-2-b.dtb + + WARNING: Binary file: lib/blobs/usbboot/bcm2710-rpi-cm3.dtb + + WARNING: Binary file: lib/blobs/usbboot/bcm2708-rpi-cm.dtb + + WARNING: Binary file: lib/blobs/usbboot/bcm2708-rpi-b.dtb + + WARNING: Binary file: lib/blobs/usbboot/bcm2710-rpi-3-b.dtb + + WARNING: Binary file: lib/blobs/usbboot/bcm2708-rpi-0-w.dtb + + WARNING: Binary file: lib/blobs/usbboot/bcm2708-rpi-b-plus.dtb + + WARNING: Binary file: lib/blobs/usbboot/overlays/dwc2.dtbo + + WARNING: Binary file: lib/blobs/usbboot/raspberrypi/fixup_cd.dat + + WARNING: Binary file: lib/blobs/usbboot/raspberrypi/start_cd.elf + + WARNING: Binary file: lib/blobs/usbboot/raspberrypi/bootcode.bin + + WARNING: Binary file: + tests/image-stream/data/unrecognized/xz-without-extension + + WARNING: Binary file: + tests/image-stream/data/unrecognized/xz-with-invalid-extension.foo + + ``` + - hash: f4e0121639d8f2cbcc15b6577ec15d7ecbab7e71 + author: Juan Cruz Viotti + footers: + change-type: minor + signed-off-by: Juan Cruz Viotti + subject: "feat(usbboot): add progress property to usbboot scanned drives" + body: |- + This commit re-architects the usbboot adapter to prepare the drives in + the background, while emitting scan results every 2s, where each drive + has a `progress` percentage property. + - hash: 684118a758805fdab74b215684c87a745707f595 + author: Juan Cruz Viotti + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "refactor(sdk): add bus number, device address, and ids in usb devices" + body: |- + The combination of bus number and device address is the only way to + uniquely identify a USB device, so we'll use that for the `device` and + `raw` properties. + Also, we store the USB vendor and product IDs as properties of the + drives, since they will be handy when implementing the prepare function. + - hash: 6a566035644a58f252edef9f932635e2b00f68a5 + author: Benedict Aas + footers: + change-type: patch + changelog-type: minor + changelog-entry: Add optional progress bars to drive-selector drives. + subject: "feat(GUI): add optional progress bars to drive-selector drives" + body: |- + We show a progress bar for any drive objects with a `progress` field + that isn't falsy, e.g. `undefined` or `0`. + - hash: 712ecdcc39fe0161ce4e861c85cc9d114d886e4e + author: Benedict Aas + footers: + change-type: none + subject: remove debugging conditonals + body: null + - hash: f3f800df7fd50ecf346f1515cab75bf0cbf6d2ee + author: Juan Cruz Viotti + footers: + change-type: PATCH + signed-off-by: Juan Cruz Viotti + subject: "style(usbboot): wait before scanning drives after the file server phase" + body: |- + This is a workaround to prevent the USB device from disappearing after + the file server phase, until the resulting block device comes up. + By adding a delay after the file server phase, we prevent the USB + scanner from getting triggered again, therefore keeping the current USB + device visible in the drive selector modal. + - hash: 24a10b209cb0014657b33f376bf1d1da90c383ab + author: Juan Cruz Viotti + subject: "fix(usbboot): handle device disconnections" + body: |- + This commit handles errors that can come up when unplugging the drive + halfway through the process. After tons of experimentation, the errors + than seem to occur are: + - `LIBUSB_TRANSFER_CANCELLED` + - `LIBUSB_ERROR_NO_DEVICE` + When these errors happen, we can omit the drive, and also not try to + close it, since given the device is no longer there, the close operation + bails out with a strange error message. + footers: + change-type: patch + changelog-entry: Gracefully handle scenarios where a USB drive is disconnected + halfway through the usbboot procedure. + signed-off-by: Juan Cruz Viotti + - hash: 41f8ac100a87f73cfd9e28e299af1033d8603a00 + author: Juan Cruz Viotti + footers: + change-type: patch + changelog-entry: Fix `LIBUSB_ERROR_NO_DEVICE` error at the end of usbboot. + signed-off-by: Juan Cruz Viotti + subject: "fix(usbboot): handle LIBUSB_ERROR_NO_DEVICE when claiming a USB + interface" + body: |- + Consider the following scenario: + - Usbboot runs successfully on a device + - Before the block device gets a chance to appear, we run usbboot again + If we're fast enough, usbboot will try to claim the device interface, + but then the drive might not be there anymore, causing a + `LIBUSB_ERROR_NO_DEVICE`. + This commit addresses that scenario, and simply ignores the drive. + - hash: af60720bfd1e850d906af8f37a6e87ef2ea85853 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "upgrade(package): Bump resin-corvus to beta.30" + body: |- + This updates resin-corvus to v1.0.0-beta.30, fixing an issue + with attempting to use https transport in browserland. + - hash: 83136c84383866e80526f607df875c20b4e42134 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "doc(CONTRIBUTING): Add note about msvs_version on Windows" + body: |- + This adds a small note about setting the `msvs_version` + in the npm config on Windows. + - hash: 088fd5c76f3520dfec5f7203d537390e902e47dd + author: Jonas Hermsmeier + footers: + change-type: patch + subject: 'doc(CONTRIBUTING): Remove refence to "install script"' + body: |- + This removes a confusing reference to an "install script" + in the dependency section. + - hash: a5f5fad5407614673f2714963187f777382585a6 + author: Benedict Aas + subject: "fix: set debug env variable on remote electron process" + body: >- + We fix the DEBUG environment variable by setting it on the + `electron.remote` + + instead, and we also move the code to `lib/gui/app.js` and away from + + `lib/gui/index.html`. + + Changelog-Entry: Set the DEBUG environment variable on the remote + + electron process. + + Change-Type: patch + - hash: 407c23f66275e4ccb875ecaeaf3dc9453dc682eb + author: Benedict Aas + subject: use debug.enabled, fix drivelist env setting + body: null + - hash: d51b8502c7f566ed78dd436757620a12feba980a + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "doc(CONTRIBUTING): Add libudev requirement to docs" + body: null + - hash: 157039439ed6a768f4d44b7c37c7a6534ed13af5 + author: Jonas Hermsmeier + footers: + change-type: patch + changelog-entry: Update Electron to v1.7.9 + subject: "upgrade(package): Update Electron v1.6.6 -> v1.7.9" + body: This updates Electron from v1.6.6 to v1.7.9 + - hash: aecf5d287e9ef3b068a9ce0a3e2f749b12ced77a + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + subject: "refactor(SDK): make adaptor scan functions event based" + body: |- + This change will allow us to start emitting progress events out of the + adaptors scan functions. + - hash: 2f0dabf8ce9dcd1afbcfd8b9fc7f772c2f5845c0 + author: Jonas Hermsmeier + subject: "refactor(sdk): Make adapters event emitters" + body: null + - hash: e3bcee42cb8e6654350287f3eae4a673951a1620 + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + subject: "fix(GUI): improve usbboot USB device branding" + body: |- + - Add a loading SVG icon while usbboot is running + - Make the device description more user friendly + - hash: 4ca1d3e96ccfcde579fdd81d4a8964bf270a9edf + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + subject: "fix(GUI): don't show the \"too small\" badge if the size is null" + body: |- + Some devices don't have a size, like USB devices in the usbboot adaptor. + The `.isDriveLargeEnough()` correctly returns `false` in this case, + however we don't want to show the `TOO SMALL` badge for aesthetics + purposes. + So if a drive has a size that equals `null`, we don't allow such drive + to be selected, and we don't show a badge for it. + - hash: 4f4e9c43fd723b38602303b5aa20a49a401d31c7 + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + subject: "fix(GUI): don't display hyphen in drive selection entry if no size" + body: |- + Some drives, like usbboot USB devices, don't have a size associated with + them, which results in the drive selection widget showing a hyphen with + nothing at the side, which looks a bit weird. + - hash: bce1b9316345776536c339e86a97d5424b5cdba4 + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + subject: 'refactor(GUI): generalize the concept of a "pending" drive' + body: |- + This commit introduces a boolean `disabled` property rather than a + `pending` flag. Making this distinction clearer means that we can now + treat pending drives in different ways needed to improve the usbboot + experience. + Also, for usbboot, this commit removes the "pending" badge and uses a + more descriptive drive description instead. + - hash: c4fc45a9c9247ce113cab37c9a7cbb4b75ddccf4 + author: Juan Cruz Viotti + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "fix(usbboot): opening device debug message prints undefined" + body: |- + We have a debug message that prints `device.name`, which is not a valid + property, and therefore the debug logs show `undefined` instead of the + USB id pair. + - hash: 773f90724cfe4597fa9d30e02b8ecc62afd84354 + author: Juan Cruz Viotti + footers: + change-type: minor + changelog-entry: Increase the flashing speed of usbboot discovered devices. + signed-off-by: Juan Cruz Viotti + subject: "feat(usbboot): add new files that provide better speed" + body: |- + We currently ship with `bootcode.bin` and `start.elf` from the Raspberry + Pi Foundation, which provide a writing speed of about 6 MB/s. This PR + includes new boot files by resin.io that boost the speed to ~20 MB/s. + - hash: 2ea95972e7ab5486561d25dfd38d8b78eb1aa57c + author: Niklas Higi + footers: + changelog-entry: Make sure the progress button is always rounded. + change-type: patch + subject: "fix(GUI): make sure progress button is always rounded" + body: |- + At the moment the progress button which has slightly rounded corners + allows the "__bar" to overflow. This causes the corners to become + angular again which looks weird. I set the button's "overflow" to + "hidden" to fix this issue. + - hash: 120522672aad94a3e623935783ba994602454bec + author: Juan Cruz Viotti + footers: + change-type: minor + changelog-entry: Add eye candy to usbboot initialized devices. + signed-off-by: Juan Cruz Viotti + subject: "feat(GUI): add some branding to usbboot-discovered devices" + body: |- + - Add a nice icon in the drive selector dialog when a device has been + discovered through usbboot + - Change the name of usbboot-initialized devices to "Compute Module" + - hash: caf38142cac1f5d6e8bf79c7f66ac4b891e2432f + author: Juan Cruz Viotti + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "fix(sdk): set usbboot control transfer timeout to infinite" + body: null + - hash: 65a3f0ed897cf30f1d6ce8da12c2327fef431064 + author: Juan Cruz Viotti + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "fix(sdk): increase bulk transfer usb timeouts" + body: |- + We experienced timeouts when sending big files (ie ~14 MBs). Setting the + timeout to 0 makes the timeout infinite. + - hash: 2bda96d08ff156b27420ce67dc810252e8f98aac + author: Gergely Imreh + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "fix(sdk): usbboot command typos" + body: null + - hash: 5fd166ea31b21124d83cefbc4fcb7350659a314e + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io-modules/drivelist/pull/229 + change-type: patch + changelog-entry: Fix permission denied issues when XDG_RUNTIME_DIR is mounted + with the `noexec` option. + signed-off-by: Juan Cruz Viotti + subject: "upgrade: drivelist to v5.2.4" + body: null + - hash: 01382d676ded6dd325bfc0759a6b26f3c7cdcb93 + author: Josh Leeb-du Toit + footers: + change-type: patch + link: https://github.com/resin-io/etcher/pull/1753 + fixes: https://github.com/resin-io/etcher/issues/1454 + subject: "fix(CLI): add check for drive flag with yes flag" + body: |- + Add an options check for the `drive` flag to appear with the `yes` flag. + If the `yes` flag appears without the `drive` flag then a user error + will be thrown. + - hash: 991568d8892bf19e78be9489be8b11b86d40bfea + author: Jonas Hermsmeier + footers: + change-type: minor + subject: "feat(image-stream): Support .bin image extension" + body: This adds support for selecting images with a `.bin` file extension. + - hash: cc9c8a81321b92474a0d8dd1d707028dc4807c00 + author: Shou + subject: "feat(GUI): use tabindex and focus to navigate" + body: |- + We make navigating with the tab key easier by highlighting focused + elements more visibly, adding `tabindex` attributes to elements, and + making `open-external` links respond to keyboard events. + Change-Type: minor + Changelog-Entry: Improve tab-key navigation through tabindex and visual + improvements. + Connects-To: https://github.com/resin-io/etcher/issues/1734 + - hash: 531ba669a42a66f0ebfebe70edf59e37b36a1d7a + author: Shou + subject: outline with 10s timeout + body: null + - hash: 975b970c9d16b7d67ba1aafd32e5b31c11db99c1 + author: Shou + subject: use orange "warning colour" as outline + body: null + - hash: bb02cb831bb979ed07ae982b1e0db47febb17634 + author: Shou + subject: smaller outline on settings buttons, fix order on settings page + body: null + - hash: bf6f77d8a6d0f20921cefe9faa67dde39ead8ee0 + author: Shou + subject: allow selection in drive-selector + body: null + - hash: 6a5b00540643b3d86744bd4e823fd231dcc86baa + author: Benedict Aas + subject: fix typo, better tabindexes + body: null + - hash: 6b16a2b13fb027604101e6d5654060a3b4b83aac + author: Jonas Hermsmeier + footers: + change-type: patch + changelog-entry: Fix Etcher being unable to read certain zip files + subject: "upgrade(node-stream-zip): 1.3.4 -> 1.3.7" + body: |- + This fixes RangeErrors occurring with some zip files. + **Changes:** + - Fixed compatibility with node.js v0.10 + - Fix error unpacking archives with a special comment + - Fix descriptive error messages + - hash: 3bd8374c734f1a4922796e376e313e2ded7600e2 + author: Jonas Hermsmeier + subject: "refactor(image-stream): Remove Promise props resolve" + body: |- + This removes `Bluebird.props()` from the image type handlers, + as it's just a remnant when some properties in the return value + were Promises that needed resolving. + Change-Type: patch + Connects To: #1724 + - hash: 3b793c85f512642ddfbe28898b214ec63ec6a18c + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix: Support raw images without secondary file extension" + body: |- + This allows selection of images without a secondary file extension + (i.e. `example.gz`, compared to `example.img.gz`) by defaulting to `img` + in the image-stream handlers, should no secondary extension be found. + Further this adjusts `.getPenultimateFileExtension()` to return `null` + if the detected penultimate extension is not a known file extension. + - hash: dd88a82892b408f5bc04f36b3a915cbf8a896223 + author: Jonas Hermsmeier + subject: "chore(package): Bump resin-corvus to 1.0.0-beta.29" + body: |- + This updates `resin-corvus` to version 1.0.0-beta.29, switching + Mixpanel and Sentry analytics to HTTPS transports. + Changes: + - fix(sentry): Default to HTTPS transport + - fix(mixpanel): Use HTTPS transport + - test: Use standardjs for linting + - doc(README): Add CI & npm badges + - fix(ci): Fix Appveyor Node version matrix + - refactor: Ensure Node 4 compatibility + Change-Type: patch + Connects To: #1718 + - hash: 6ed2bec76f1a67fe29547db10ff308d2d5829c26 + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + subject: "chore: pass a dictionary to codespell.py" + body: The `-` option loads the default dictionary. + - hash: e301ac4cff34c20995780b8b791d772b3b32121c + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io/etcher/pull/1703 + signed-off-by: Juan Cruz Viotti + subject: "docs(README): execution -> executable" + body: null + - hash: 673fabfcb003d8f193b67d714bc31b2d5f483161 + author: Juan Cruz Viotti + footers: + fixes: https://github.com/resin-io/etcher/issues/1699 + change-type: patch + changelog-entry: Try to use `$XDG_RUNTIME_DIR` to extract temporary scripts on + GNU/Linux. + signed-off-by: Juan Cruz Viotti + subject: "upgrade: drivelist to v5.1.8" + body: null + - hash: 5d458d9e3a6ee048dffd252f19d5e8baf9f571b3 + author: Juan Cruz Viotti + footers: + fixes: https://github.com/resin-io/etcher/issues/1706 + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "chore: fix CLI packaging snapshot relative directory" + body: |- + The current CLI releases are broken. Seems that `pkg` creates the + application snapshot based on the current working directory, so at the + moment, the snapshot gets created based on the root of the project, + rather than based on the dist/Etcher-cli-* directories, causing the + native add-ons to not be resolved correctly. + - hash: 796515afda968b8fd6e0f8a04d2cb770505fad05 + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io-modules/mountutils/pull/45 + change-type: patch + changelog-entry: Retry ejection various times before giving up on Windows. + signed-off-by: Juan Cruz Viotti + subject: "upgrade: mountutils to v1.2.2" + body: null + - hash: ffc807b00f15adfa42ff53388093d267d61073ab + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io/etcher/pull/1686 + signed-off-by: Juan Cruz Viotti + subject: 'feat(GUI): support new "pending" drive flag' + body: |- + We recently added a "pending" flag to all drives that represents whether + the drive is ready for selection or not. This flag will be used by the + "usbboot" flashing adaptor, which will emit various "pending" USB + devices while it converts them to block devices that can actually be + flashed. + In terms of the GUI, the following visible changes were made: + - Drives with a `pending: true` property will be disabled in the drive + selector window + - Drives with a `pending: true` property have a "PENDING" red badge + - hash: 2b5b2ed74a8122fdbdc71e9a2453a917792b929b + author: Shou + footers: + changelog-entry: Add a sudo-prompt upon launch on Linux-based systems. + signed-off-by: Juan Cruz Viotti + subject: "feat: add sudo-prompt to start on linux" + body: |- + We prompt the user with a sudo-prompt upon launch on Linux-based systems + to ensure the program has enough permissions for features needed + throughout the program's runtime. + - hash: ca126f1d5addd3ef3895e5dfe8dedd5bbc9bffa3 + author: Juan Cruz Viotti + subject: 'Revert "chore(package): Bump resin-corvus to 1.0.0-beta.29 (#1720)"' + body: This reverts commit e65431199773f387f64118c17d53aff4ef3b642b. + - hash: 2b4fd8849ed1e87b99656afd4973a4f58ef055b6 + author: Benedict Aas + subject: remove ETCHER_RUNNING env var + body: null + - hash: 6bb21d4d300b9725cfd51eb2587209ae66af526b + author: Juan Cruz Viotti + footers: + change-type: patch + see: https://github.com/resin-io/etcher/pull/1686 + signed-off-by: Juan Cruz Viotti + subject: "refactor: use an SDK orchestrator to implement drive scanning" + body: |- + This is a major first step towards adopting an SDK architecture. This + commit creates an SDK adaptor with a `.scan()` function that uses + `drivelist` under the hood. Then, an SDK orchestrator is used to provide + drive scanning capabilities to the GUI. + Here's a list of some particularly interesting changes: + - The drives returned by the SDK adaptor now have a "pending" and an + "adaptor" property. The "pending" property is a boolean flag that + determines if the drive is ready to be used (this will come handy for + usbboot), while the "adaptor" property simply contains the name of the + adaptor that drive came from + - The GUI drive scanner Rx implementation was replaces with a "promise + loop." Before, the drive scanning routine would be called every 2 + seconds (without waiting for the previous scan to complete), while + now, the next scan happens *after* the previous scan completes. For + this reason, I reduced the drive scanning interval timeout to match + the timing we had before + - hash: 45ce9a8114edee05647afc34c3638d71c1c2a411 + author: Juan Cruz Viotti + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "test(shared): ensure drive objects can contain extra properties" + body: |- + The usbboot integration will bring in drive objects that include a lot + more properties than the current drive objects. This commit ensures that + the redux store can handle those extra properties. + - hash: f2fb0a9b4a543fc2184a1f42d368dfc86da47747 + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io/etcher/pull/772 + signed-off-by: Juan Cruz Viotti + subject: "chore: don't zip AppImages" + body: null + - hash: b038ae49534ff0aeb2c9bad1bd1c9220c1c5c193 + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + subject: "chore: fix build system" + body: |- + - Bintray deployments are broken because of some bash nested quoting + issue + - Travis CI will attempt to cache Docker layers on macOS + - Docker caches from different architectures will override each other + - hash: f5293d9f3e81037164270d0568f59da78df1cd3a + author: Juan Cruz Viotti + footers: + see: https://giorgos.sealabs.net/docker-cache-on-travis-and-docker-112.html + signed-off-by: Juan Cruz Viotti + subject: "chore: cache Travis CI docker builds" + body: |- + Let's see if we can reduce the time it gets to build and test Etcher on + GNU/Linux. + - hash: 71dfebe883e866e24f9cf5d85147c938a8dbfce4 + author: Juan Cruz Viotti + footers: + change-type: patch + changelog-entry: "Fix \"Couldn't scan the drives: An unknown error occurred\" + error when there is a drive locked with BitLocker." + fixes: https://github.com/resin-io/etcher/issues/1687 + signed-off-by: Juan Cruz Viotti + subject: "upgrade: drivelist to v5.1.5" + body: See https://github.com/resin-io-modules/drivelist/pull/206 + - hash: 59e0562860284aca890067880dea933d26687d0b + author: Juan Cruz Viotti + footers: + change-type: minor + changelog-entry: Integrate Raspberry Pi's usbboot technology. + fixes: https://github.com/resin-io/etcher/issues/1541 + see: https://github.com/raspberrypi/usbboot + signed-off-by: Juan Cruz Viotti + subject: "feat: implement usbboot adapter" + body: |- + This commit installs `node-usb` v1.3.0 from GitHub, since that version + was never published to NPM, and is the only one that works with Visual + Studio 2015 (see https://github.com/tessel/node-usb/issues/109). + The usbboot communicates with a Raspberry Pi / Amber through USB and + eventually mounts it as a block device we can write to. + This feature bundles bootcode.bin and start.elf from the original + usbboot implementation. + The flow is the following: + - On each scan, the usbboot scanner will try to get a usbboot compatible + USB device to the next "phase", until they are all transformed to + block devices the user can flash to as usual + - hash: 27aca934344f4631d62585f1e56798b26dcdd82d + author: Juan Cruz Viotti + footers: + fixes: https://github.com/resin-io/etcher/issues/1155 + signed-off-by: Juan Cruz Viotti + subject: "docs: add chocolatey install instructions" + body: null + - hash: dc43c0199b21ce331749be45514b58583809621b + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io/etcher/pull/1663#discussion_r131623802 + signed-off-by: Juan Cruz Viotti + subject: "chore: enforce single quotes in ESLint" + body: |- + We recently adopted the standardjs guidelines ESLint, which doesn't seem + to enforce single quotes, even though the guidelines mention it. + - hash: 86cd46f26130e2557ec1c275e30958f161d05899 + author: Jonas Hermsmeier + footers: + change-type: feat + subject: "feat(writer): Implement streaming pipelines" + body: null + - hash: 2a3effb9a0d5de930e30b665d10e17c7fbf50e34 + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + subject: "refactor: simplify release type handling within the app" + body: |- + As another step towards moving to GitHub Releases, this commit makes the + application care much less about the actual release type of the current + version, instead checking if the application is stable or not, which is + more aligned to what GitHub provides us. + - hash: 11e0046eea82c5a31c74fe123720e38ded668705 + - hash: 50e791b0a877660815709f54942e6ca90b014a1f + - hash: a42499681f95b735bab7eaadb51caeb564797d3f + - hash: 4777a9d8ea3c19a502863bb9761fe377471d6b91 + - hash: a33536a55df0b431a81ef6ffa981d44db5d92e20 + - hash: ab4d5f1b908cf671a8862fa6a5512349044def61 + - hash: 8205321af821e02f8be65965ac627f9002a13665 + - hash: 7c73b87c73235ab1f27c09ea6108b693184973ac + - hash: 41c895b6996a5217f0c26cb24998fe1d51674383 + - hash: b3c82e97465d2f1df1049a15aa11399e4fc8bc08 + - hash: 9e9169202e1299bf156c79e4f61aec5836368efe + - hash: 51d48a39318a8a22d6bb731c9aacb7800cbc0883 + - hash: 38d9db8ed9945fbb914d2df361e76379750c9b85 + - hash: 1473f91f0fd4e215dca7bdaeddcaf0c9c0b6b71d + - hash: 36c2f7eb41ead78c028aee8107288884c01eabac + - hash: be262bf193cc9ea6d391bbbe58043a7627b92654 + - hash: 194d26b4e3ef53442104b7a5c4caebe284d9f5db + - hash: b2d3d0ecb8eadd14593c3b7587775d1ac4b5475e + - hash: 71cb4e9be21eaa8772c0a362a616ae77920c87b5 + - hash: ad3d3cb18f812be4f18a52872ea1543baaacd7cc + - hash: 819a371976c3d981883240027fcaae601ec3b95d + - hash: babb607e2761a683b5393ca9220c6e42d0eac432 + - hash: 913b83e17f0f6377f70df7cb0c118f2fb9be08f6 + - hash: e282c1b10b1fe286366414969bb70c87eafddd6f + - hash: 59d2c542d863e5ec9be7cae1abd49debf68235b1 + - hash: f64d1f6a3233aeb17e728f6a479e3968322d3276 + - hash: d355dd0a8790a003edf061e893b0d0ccaa81deb2 + - hash: f3aa48269d81fde60b5e18c2cf2f73a0f0c0e722 + - hash: 5c0a42c647081504c25394db3f2bb9d12a9a7a94 + - hash: 4c21ebc999a543b6fb9b102480f764901aef223a + - hash: 91dfddef2d27979ab30a705f8cb19c5c746463b4 +- version: 1.1.2 + date: 2017-08-07T15:10:39.000Z + commits: + - hash: 6ff8110473648517ec16f33c80cc71b77ab84b15 + author: Shou + footers: + change-type: patch + changelog-entry: Make archive-embedded SVG icons work again. + see: https://github.com/resin-io-modules/drivelist/pull/204 + signed-off-by: Juan Cruz Viotti + fixes: https://github.com/resin-io/etcher/issues/1636 + subject: "fix(GUI): make archive-embedded svgs work again" + body: |- + We make the svg-icon component accept XML in its path argument to handle + archive-embedded SVG icons. + - hash: b99f027e37c205e332fc23c3d73db012e060fe47 + author: Shou + footers: + see: https://github.com/resin-io/etcher/pull/1611#discussion_r131349440 + signed-off-by: Juan Cruz Viotti + subject: add test + body: null + - hash: 6d3941b4fb30355414875df92c2bfb1b5276a550 + author: Shou + footers: + signed-off-by: Juan Cruz Viotti + subject: secure against sibling html and foreignObject + body: null + - hash: 3b19c076128430b29866edf069883f2e9a4e40e7 + author: Shou + footers: + see: https://github.com/resin-io/etcher/pull/1657 + signed-off-by: Juan Cruz Viotti + subject: tests done + body: null + - hash: 1a599d386c779eb34b1cd4ac19e59cbf4ed2ae80 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "doc: Add link to commit guidelines to contributing guide" + body: This adds a reference to the commit guidelines to the contributing guide. + - hash: 449faaba99b3e193334cb304675d1427f8b20bb9 + author: Jonas Hermsmeier + footers: + changelog-entry: Make disabled SVGs work in IMG tags. + change-type: patch + subject: "doc: Merge running locally into contributing guide" + body: |- + As recently several people have been asking for things + that are described in `RUNNING-LOCALLY.md`, but couldn't be + found in the `CONTRIBUTING.md`, this consilidates the two into + one single resource to look for on how to get started developing. + - hash: f4778955df8ff33397164b2337ef7d645c4e9c60 + author: Juan Cruz Viotti + subject: "fix(CLI): pass required arguments to flashComplete message" + body: |- + The `flashComplete` message takes the drive object and the image + basename as arguments. This was updated on the GUI, but causes the CLI + to throw an error upon completion. + footers: + change-type: patch + changelog-entry: Fix "imageBasename is not defined" error on the CLI. + signed-off-by: Juan Cruz Viotti + - hash: d75a75e26f3cc4e51d5f5dbf60cf4963f38b0d53 + author: Juan Cruz Viotti + subject: "fix(GUI): throw a user error if the user is not in the sudoers file" + body: null + footers: + change-type: patch + changelog-entry: Display a user-friendly error message if the user is not in the + sudoers file. + signed-off-by: Juan Cruz Viotti + - hash: ece7d406074a1463e07b2a61ae4ecd4518712795 + author: Juan Cruz Viotti + footers: + see: https://standardjs.com + signed-off-by: Juan Cruz Viotti + subject: "chore: publish development Bintray packages" + body: |- + This commit includes several changes to adapt the CI configuration files + and Bintray publish script to perform development deployments. + - Move our Bintray details to the Makefile + - Deploy to a new Bintray component if `RELEASE_TYPE` is `snapshot` + - Call `publish-bintray-debian` and `publish-bintray-redhat` in the CI + deployment script + - Call the Bintray deployment scripts for RPMs + - hash: 81df8dd47ebf476e50f9d36cd4f2c66d42765427 + author: Juan Cruz Viotti + footers: + fixes: https://github.com/resin-io/etcher/issues/1525 + change-type: minor + changelog-entry: Fix `UNABLE_TO_GET_ISSUER_CERT_LOCALLY` error at startup when + behind certain proxies. + signed-off-by: Juan Cruz Viotti + see: https://github.com/resin-io/etcher/pull/1555 + subject: "chore: use electron-builder default package names" + body: |- + We're currently manually changing the names of the final packages + created by `electron-builder`. This commit makes Etcher use the default + package names that `electron-builder` picks for us. + The Windows final package names contain spaces, so I did keep the + `artifactName` entries for them, which now basically use what + `electron-builder` recommends, but use hyphens instead of spaces. + - hash: 9a244de6a698e000b51bacf5758965911764ebb9 + author: Jonas Hermsmeier + footers: + change-type: patch + changelog-entry: Fix `EHOSTDOWN` error at startup. + fixes: https://github.com/resin-io/etcher/issues/1645 + signed-off-by: Juan Cruz Viotti + subject: "refactor(gui): Only enable full debug output on demand" + body: |- + This disables full wildcard debug output by default now, + leave the possibility to manually enable selective debug output + via the `DEBUG` environment variable. + - hash: 1280efe66d376cc974f22747d8067573c71186c2 + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io/etcher/issues/1356 + change-type: patch + changelog-entry: Fix various drive scanning Windows errors. + fixes: https://github.com/resin-io/etcher/issues/1639 + signed-off-by: Juan Cruz Viotti + subject: "refactor(GUI): make settings model setter asynchronous" + body: |- + This is part of the process of implementing support for a configuration + file. We previously decoupled the Redux store from localStorage by + moving the logic that actually persists the data to localStorage to a + local-settings.js file, however the localStorage API is synchronous, so + it follows that at the moment, all functions that interact with are also + synchronous. + Moving to storing the settings to a file means turning all these + functions to promises, which we do in this commit, in order to not mix + the addition of the configuration file feature with the huge amount of + refactoring it requires. + - hash: 9ef6cdfa209ea2060aae5b07e1c606dde1fc2c03 + author: Juan Cruz Viotti + subject: "refactor(image-stream): parse xz and gzip metadata using a custom read + function" + body: |- + This commit refactors the xz and gzip image handlers to pass/use a + custom read function to be able to determine the uncompressed size, and + other needed metadata. + By using this function (which currently only uses the `fs` module), we + can implement support for getting the uncompressed size of compressed + files using HTTP Ranges. + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + - hash: 36bca516a3adc3d6641e55d13ff50178827d7764 + author: Shou + subject: "feat(GUI): make size units closest relative" + body: |- + We make the size units used the closest relative unit through a new + filter `closestUnit` replacing the old `gigabyte` filter. + footers: + changelog-entry: Make the size units the closest relative. + - hash: a80f01aebc89c94b5e04c1136c925d46399a031a + author: Shou + subject: use pretty-bytes + body: null + - hash: cd2d0e8ff7bbc37bb5a8d42ad5c74ec557d68098 + author: Shou + subject: remove filters folder + body: null + - hash: ae9713807d5338565d498f6f0a01f181995eeb52 + author: Shou + subject: new shrinkwrap, add to package.json + body: null + - hash: 6dc5458b99be4c8c2bea72a861ff982d698f1d47 + author: Shou + subject: test + body: null + - hash: 9f6e5fa9c72dcc465ae0718b7d7072f9b47ca2e9 + author: Dhruv Paranjape + subject: Update README.md + body: null + - hash: de4960477864bd46e87e6805a8f1f5dda01bf768 + author: Lucas Rangit MAGASWERAN + footers: + signed-off-by: Lucas Magasweran + subject: "docs(README): add debian repository in one line" + body: For convenience, create the apt source file and add the repository in one + line. + - hash: 904ba9820401a86fd2a190ec92bf20211140f773 + author: Bob Moragues + footers: + change-id: Ia7e3aef0d90fdf21d373a560e6dd2b96e6b51da8 + changelog-entry: Add support for .rpi-sdcard images. + subject: "feat: support rpi-sdcard image file type" + body: |- + Support the rpi-sdcard image file type output by Yocto for + the Raspberry Pi device. + - hash: 42cc644279e6f96f0163a333172a667d2b130691 + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io/etcher/pull/1625 + signed-off-by: Juan Cruz Viotti + subject: "refactor: address review comments from #1625" + body: |- + That PR was merged in a rush, so this is the follow-up commit addressing + the review comments made there. + - hash: b5c781b9a965b8d203121876b22b5e0f95c034e9 + - hash: 410eca3d120b5a09f677f4257ea338790a153487 + - hash: 1eed490b752e09789026df0796ad6f48c370c403 + - hash: 2b90f0ab993b77cf475696edd9225a86a7255970 + - hash: 71d2da5e77046b7a7df68c1ad4b09ec317b4a06d + - hash: 6bb465e6b9d56ceebd2e14e7a933243d231c2d69 + - hash: 7ca87670798355825200f3251a65204f64d7625f + - hash: 87b45e4c24faa4cfe373718280cec7852f8e923d + - hash: 1cb687d43501e33bf7de37bd26108c61ddb52a7d + - hash: b59bf781a08337ccb2d39ca2f270239d3efdad8f + - hash: 3b72818393ce0c40759d192df2c18e3136a92045 + - hash: a1811272c6ad56d844b3be526a3fce4525ee1ec3 + - hash: 8ff5a1982b3b5ecf0eb728ef331f49686dfd867d + - hash: ef945524b2d3db13e5c8635666d30f159bb2ca4b + - hash: b650c0e3596d2cecf53f23967544d6ebd1e31213 + - hash: d02b4e901728e8791305e959e9a956e8d84c5d07 + - hash: d050ceca79f04806e5f6211478ce384fe83efecc + - hash: 7f62cea342ad4525ecf931508ea30f314e250479 +- version: 1.1.1 + date: 2017-07-24T18:55:35.000Z + commits: + - hash: f2791f4e86b3b2a9419c5dc6e36c923b7682de7f + author: Andrew Scheller + subject: "docs(PUBLISHING): fix Etcher forum link" + body: null + - hash: da62807657019cd6ea52d5dee6f6331dc9b28c68 + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + subject: "chore: use old custom build system to create AppImages" + body: |- + electron-builder seems to ship with an older AppImages version that + doesn't play very well with the custom AppImages elevation system we + created. + More particularly, we can't execute custom binaries inside the mounted + AppImage given that the mount point seems to lose permissions, owner, + and group file information. + This commit goes back to our old custom build system just for AppImages, + until we properly solve the problem, which will likely involve updating + the AppImages version in electron-builder. + - hash: aacdc74ebbb400b8463c801ee6715fbf2f65a654 + author: Andrew Scheller + subject: "chore: `make distclean` now deletes `build` directory too" + body: null + - hash: 7ea148c2ffc015043a44426d62f48be1f2863ea2 + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io-modules/mountutils/pull/44 + change-type: patch + changelog-entry: Fix most "Unmount failed" errors on macOS. + signed-off-by: Juan Cruz Viotti + subject: "upgrade: mountutils to v1.2.1" + body: |- + This version contains a fix to a set of very recurrent "Unmount failed" + macOS errors. + - hash: 35c424d7950ad2fdec483441f86a88feea5b539a + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + subject: 'fix(GUI): properly pass error object to "Flash error" event' + body: |- + Simply running `_.merge` on an Error object results in an empty plain + object `{}` being sent to Mixpanel/Sentry. + - hash: 2285926fa696bdcf21e6608398aff94013674819 + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + subject: "chore: remove the concept of target and host platforms" + body: |- + Its very unlikely that we will ever support cross platform builds. For + that reason, let's simplify the whole Makefile by removing the concept + of target and host platforms. + - hash: ff2aad0fc1eb19bd415d0f9c0861bc817f0c42d0 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(writer): Use final size if it's not an estimation" + body: This avoids running into the "flashstate percentage above 100%" error + again. +- version: 1.1.0 + date: 2017-07-21T12:10:47.000Z + commits: + - hash: c292081eae3c1a1fd34aa30b1966bf269a26420c + author: Shou + footers: + signed-off-by: Juan Cruz Viotti + see: https://github.com/resin-io/etcher/issues/1465 + change-type: patch + changelog-entry: Remove Angular usage from DrivesModel. + depends: https://github.com/resin-io/etcher/pull/1264 + subject: "refactor(GUI): remove angular from DrivesModel" + body: We remove usage of Angular from DrivesModel. + - hash: 01c07e5e2704acafc0f8e0279052aef988fa8572 + author: Shou + subject: remove angular injection from tests + body: null + - hash: 54bc8dfd339010db16f3e6450f7221b62df5a245 + author: Shou + footers: + fixes: https://github.com/resin-io/etcher/issues/1578 + change-type: patch + changelog-entry: Correct the relative notification icon path. + signed-off-by: Juan Cruz Viotti + see: https://github.com/resin-io/etcher/issues/1443 + subject: move file + body: null + - hash: 8a25922c42ea417cc643db73d8ca40efaef0ade3 + author: Shou + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: add empty array test + body: null + - hash: ff1c2b4b24ead7d33655083df676ef5973f225d9 + author: Jonas Hermsmeier + footers: + closes: https://github.com/resin-io/etcher/issues/1465 + signed-off-by: Juan Cruz Viotti + see: https://github.com/resin-io/etcher/issues/1383 + changelog-entry: Stop settings from overflowing into the footer. + subject: "feat(image-stream): Read MBR & GPT in .getImageMetadata()" + body: null + - hash: f42c205e9ddb8206fe0a8cb50e686375a73e9774 + author: Jonas Hermsmeier + footers: + see: https://github.com/resin-io/etcher/pull/1595 + signed-off-by: Juan Cruz Viotti + subject: "feat(gui): Display warning when image has no MBR" + body: null + - hash: 4c3a58a4b13f3b7bad1468fc96af2c0cab4a35f0 + author: Jonas Hermsmeier + footers: + see: https://github.com/resin-io/etcher/issues/1437 + signed-off-by: Juan Cruz Viotti + changelog-entry: Don't break up size number in drive selector. + subject: "fix: Mend merge conflict resolution" + body: null + - hash: ae69d889ab767ac61cba82fe357cfa16017b2d36 + author: Jonas Hermsmeier + footers: + signed-off-by: Juan Cruz Viotti + changelog-entry: Use React instead of Angular for the SVGIcon directive. + subject: "test(image-stream): Update .isSupportedImage() tests" + body: null + - hash: 54b2e391619759f7a87ec81556ad55983c3e3dd6 + author: Jonas Hermsmeier + footers: + signed-off-by: Juan Cruz Viotti + subject: "fix(supported-formats): Fix missing change in recursion" + body: null + - hash: 43505741a2b11fe9ef34753058c45577d2096951 + author: Jonas Hermsmeier + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "feat(image-stream): Normalize MBR & GPT partitions" + body: null + - hash: 0ecb8cf6f40c4d6467808803d018bbb54f042562 + author: Jonas Hermsmeier + footers: + signed-off-by: Juan Cruz Viotti + subject: "refactor(image-stream): Rewrite parse-partitions" + body: |- + Improved speed and resilience, while also fixing detection + for compressed and archived images + - hash: f8607cde8db90be2c35cf0a2f560baef7425fd35 + author: Jonas Hermsmeier + footers: + signed-off-by: Juan Cruz Viotti + subject: "test(image-stream): Add partition info" + body: null + - hash: 242fc709b80eb4fa8c014357db65a620ad1cf558 + author: Jonas Hermsmeier + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "test(image-stream): Update .dmg test images" + body: null + - hash: 461c237b1fc29934647364df0b38e42854ce97cb + author: Jonas Hermsmeier + footers: + see: https://github.com/resin-io/etcher/pull/1547#discussion_r126790010 + signed-off-by: Juan Cruz Viotti + subject: "test(image-stream): Update assertions to match rpi image" + body: null + - hash: c77b08efd63b9e2d3fb0abe38e0809fe26593cfa + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "feat(image-selection): Send missing part table event" + body: null + - hash: b9a0f258b08fe147ae8fe2d423f4c8b985875b17 + author: Jonas Hermsmeier + footers: + signed-off-by: Juan Cruz Viotti + change-type: patch + changelog-entry: Fix "You don't have access to this resource" error at startup + when behind a firewall. + fixes: https://github.com/resin-io/etcher/issues/1458 + subject: "test: Update partition values to match test image" + body: null + - hash: 5b82016af26f3df6cf44674fffbed9e5361e206a + author: Jonas Hermsmeier + footers: + see: https://github.com/resin-io/etcher/issues/1443 + change-type: patch + signed-off-by: Juan Cruz Viotti + changelog-entry: Add image name, drive name, and icon to notifications. + subject: "refactor(image-stream): Address comments" + body: null + - hash: f7fa60804ddd63d8ac62671f1ad485955e0dbd63 + author: Jonas Hermsmeier + footers: + see: https://github.com/resin-io/etcher/pull/1409 + change-type: patch + signed-off-by: Juan Cruz Viotti + fixes: https://github.com/resin-io/etcher/issues/1429 + subject: "test(image-stream): Update partition data" + body: null + - hash: e9485d894fcfb4116e056e9fa63575201d9093ec + author: Jonas Hermsmeier + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + fixes: https://github.com/resin-io/etcher/issues/1444 + subject: "chore(image-stream): Fix lint errors" + body: null + - hash: 312e88cf3b515a3979d4fed08c772814dc474c8f + author: Jonas Hermsmeier + footers: + change-type: patch + see: https://github.com/resin-io/etcher/pull/1401#discussion_r116547053 + signed-off-by: Juan Cruz Viotti + subject: "chore(shrinkwrap): Fix shrinkwrap" + body: null + - hash: d86be4d41c28a0610b9eee94984d7ebf70433211 + author: Jonas Hermsmeier + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "refactor(image-stream): Address review comments" + body: null + - hash: f32a4c2734836f0fba3aa33bce0eb6413e0c7972 + author: Jonas Hermsmeier + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "upgrade(package): Update mbr 1.1.1 -> 1.1.2" + body: null + - hash: ef6cf529c3e222d2968b9b5e6bc3fbb77670c5fc + author: Jonas Hermsmeier + footers: + change-type: patch + changelog-entry: Cleanup drive detection temporary scripts created for other + operating systems + fixes: https://github.com/resin-io/etcher/issues/1571 + see: https://github.com/resin-io/etcher/pull/1401#pullrequestreview-37459059 + signed-off-by: Juan Cruz Viotti + subject: "test(image-stream): Add GPT test image" + body: null + - hash: a7226ffdf321f319c3ba31eb576630e4699276ba + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "fix(image-stream): Set MAX_STREAM_BYTES to 64K" + body: Bump `MAX_STREAM_BYTES` to accommodate full GUID Partition Tables. + - hash: 45d83890370a0dca4041a25e3d1a2f9bfd3e143f + author: Jonas Hermsmeier + footers: + change-type: patch + changelog-entry: Send anonymous analytics about package types. + fixes: https://github.com/resin-io/etcher/issues/1328 + signed-off-by: Juan Cruz Viotti + subject: "refactor(image-stream): Address review comments" + body: null + - hash: d9b556f80b7253eb5483a961e62c8827bcd10ce2 + author: Dhruv Paranjape + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: remove bintray file not my place neither do i have the keys. + body: null + - hash: 0b8ed1b6706fb57a15db4f33e97f09194904f5d7 + author: Dhruv Paranjape + footers: + change-type: patch + subject: Remove last visage of publishing rpm's to bintray. + body: null + - hash: e26d2f48bf6659e9f8d06ec604e9faf98c759ea2 + author: Dhruv Paranjape + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: address review comments. + body: null + - hash: 825cb174e26259d84802996df8b3220c58e96646 + author: Dhruv Paranjape + footers: + change-type: patch + subject: Merge branch 'master' into master + body: null + - hash: 5140d1e892f399f5943c8834f48fa7c070ad8106 + author: Dhruv Paranjape + footers: + change-type: patch + subject: remove electron installer redhat from optional dependancies and add it + to dockerfiles. also remove variable ELECTRON-INSTALLER-REDHAT inline + with electron installer debian script. + body: null + - hash: d675b538dde50b1d6586b732172073ea273e91a6 + author: Dhruv Paranjape + subject: Add dependancy on libXScrnSaver and remove unsupported fields from + config.json. + body: |- + add rpm package to dockerfiles. + add dependancy check on rpmbuild to installer script. + - hash: 1a50c52014965b27e368bdfa715f0485c254403f + author: Dhruv Paranjape + footers: + see: https://github.com/resin-io/etcher/pull/1550/files#r125015773 + signed-off-by: Juan Cruz Viotti + subject: Merge remote-tracking branch 'upstream/master' + body: null + - hash: 1950f13d79ceb722d9407a2a41563c1329d80dff + author: Dhruv Paranjape + subject: change dependancy from lsb-core-noarch to just lsb. + body: null + - hash: 62d1fa98b4ede5253f62031eaa3f53ba6f11066c + author: Dhruv Paranjape + footers: + change-type: patch + subject: Merge remote-tracking branch 'upstream/master' + body: null + - hash: d966ce2c0b6d82b1777ad02877927ba348376df3 + author: Dhruv Paranjape + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: address review comments. + body: null + - hash: 19637b8180e8df5762ef727c10fa3f74fe945fbf + author: Dhruv Paranjape + footers: + change-type: patch + changelog-entry: Fix "file is not accessible" error when flashing an image that + lives inside a directory whose name is UTF-16 encoded on Windows. + fixes: https://github.com/resin-io/etcher/issues/1459 + signed-off-by: Juan Cruz Viotti + subject: Add bintray target for rpm packages. + body: null + - hash: 54e5040468c5625b38dec81480004f3559d2b2c8 + author: Dhruv Paranjape + footers: + changelog-entry: Add Webview API version parameter. + subject: Merge branch 'master' of github.com:resin-io/etcher + body: null + - hash: c63ab164e5cfb619863beb432bdf3f892d505e03 + author: Dhruv Paranjape + subject: Merge remote-tracking branch 'upstream/master' + body: null + - hash: efde188b76f0e0241196993f5886245714e0c970 + author: Dhruv Paranjape + subject: Merge remote-tracking branch 'upstream/master' + body: null + - hash: 841846b954e6484cea40f4af20c9d3a953740c1d + author: Dhruv Paranjape + subject: Merge remote-tracking branch 'upstream/master' + body: null + - hash: cfdf8c645255405928de9357f559ef6772c1011a + author: Dhruv Paranjape + footers: + change-type: patch + subject: Merge remote-tracking branch 'upstream/master' + body: |- + Conflicts: + scripts/build/docker/Dockerfile-i686 + scripts/build/docker/Dockerfile-x86_64 + scripts/build/docker/Dockerfile.template + - hash: a4f7a40ff25ab6afbd0169f6965126f6fe862681 + author: Dhruv Paranjape + subject: Merge remote-tracking branch 'upstream/master' + body: null + - hash: fefbe143be2e8bfde3800583d879bd5a01d1de15 + author: Dhruv Paranjape + subject: Fix missing dependancy removed during conflict resolution. + body: null + - hash: 4d9114d59f3b8e49cdc59f50f33770a31e3766da + author: Dhruv Paranjape + footers: + change-type: patch + subject: Merge branch 'master' into master + body: null + - hash: 15d0201f86d97703ec1d63e5cdcfbd77e1fab4e8 + author: Shou + footers: + change-type: patch + subject: "feat(GUI): reset webview after navigating away" + body: |- + We reload and reset the webview to its original URL when the user + navigates away from the success screen. + Changelog-Entry: Reset webview after navigating away from success + screen. + - hash: 11f8127bc762bb5b069da3c1f67aa0cd597283c1 + author: Shou + footers: + signed-off-by: Juan Cruz Viotti + subject: conflate state functionality; shouldLoad -> shouldShow + body: null + - hash: 7156ef1ac6e94b164b9aa7dec95d1110ccda2c9e + author: Shou + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: Events React -> Events that React + body: null + - hash: fa33aa2c029c8670e357a2f60df8e45b13fc4598 + author: Shou + footers: + see: https://github.com/resin-io/etcher/pull/1514 + signed-off-by: Juan Cruz Viotti + subject: "GET param constant, makeURL return string, TODO: fix restarting" + body: null + - hash: d94b0765b89f0ff333aaa18d81b7442d17c241ac + author: Shou + footers: + see: https://github.com/electron-userland/electron-builder/releases/tag/v19.9.1 + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: delay reload, disable caching for webview + body: null + - hash: b67afbeffdc834365add2a82d68978eef8814998 + author: Shou + footers: + see: https://github.com/zeit/pkg + fixes: https://github.com/resin-io/etcher/issues/1450 + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: fix webview src resetting + body: null + - hash: dfab9527ce18e2c69d99b866244c87e5655c0497 + author: Shou + footers: + changelog-entry: Deangular the os-dialog and error modules. + subject: fix linter not equals complaint + body: null + - hash: da9656a6a911bf872f08c7e302bad2a5ba4d6eaa + author: Shou + subject: StateController refactor to agnostify SafeWebview + body: and moving the session creation to SafeWebview + - hash: 3676629d123e4cfdb24d22ffe49344262447752f + author: Shou + subject: remove component folder, refactor events and url, session constant + body: null + - hash: bd73053566829241d30787df69e3a902becbb309 + author: Shou + subject: only accept specific json objects from webview console + body: null + - hash: f95a7f1ccf11490e1f5784af423a221893d23a43 + author: Shou + subject: use robot + body: null + - hash: ce8ec071f4951d26bbfb55985e9b5e7593943073 + author: Shou + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: extensive usage of robot + body: null + - hash: 58292c33f47331f179bea1c66461a29feade94e0 + author: Jonas Hermsmeier + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "doc(CLI-INSTALLATION): Make headings h3" + body: null + - hash: 0246bf770204c0d4cf3bd3b0e0a2fd5545a4935a + author: Andrew Scheller + footers: + see: https://github.com/electron-userland/electron-builder/issues/1723 + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "docs(CLI): move the CLI installation instructions to a separate page" + body: null + - hash: aebaee0ce5f28017a415e8d3d97a4535431ed6b9 + author: Juan Cruz Viotti + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "docs(CLI): add installation instructions" + body: null + - hash: 35296caae4b1cf428036179d3479db296c7671ae + author: Juan Cruz Viotti + footers: + changelog-entry: Swap speed and time below the progress bar. + closes: https://github.com/resin-io/etcher/issues/1312 + see: https://github.com/resin-io/etcher/pull/1372 + signed-off-by: Juan Cruz Viotti + subject: "chore: check that there are no unstaged shrinkwrap changes" + body: null + - hash: 1413425b11a8077ce4699199d8206283a616466c + author: Juan Cruz Viotti + footers: + change-type: patch + see: https://github.com/resin-io/etcher/pull/1354 + signed-off-by: Juan Cruz Viotti + subject: "chore: create installers (but don't publish) on every pull request" + body: |- + This allows us to catch changes that break our installer builds before + merging the problematic changes. + As a way to simplify the CI configuration files, this commit introduces + an `installers-all` Makefile target that builds all installers. + This commit also replaces all the `cp -rf` calls with `cp -RLf` in + Makefile to avoid some weird hard link Appveyor issues. + - hash: 9a24a223ab99ee59ac1bad86c270578ccb834201 + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + see: https://github.com/electron/electron/pull/8590 + change-type: patch + changelog-entry: Turn the update notifier modal into a native dialog. + subject: "refactor(GUI): turn the update notifier modal into a native dialog" + body: |- + Electron v1.6.1 introduced checkbox support to the native message + dialog, giving us everything that was needed to implement the update + notifier modal using a native dialog. + This change allows us to get rid of a lot code. + - hash: 76e691079ccf84413e7e4e4c2ad25e231bc85c01 + author: Juan Cruz Viotti + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "chore: make use of electron-builder to build GNU/Linux packages" + body: null + - hash: 080f32b6728384a8b312cbf541f7ce8fd0386296 + author: Juan Cruz Viotti + footers: + change-type: patch + changelog-entry: Generate single-binary portable installers on Windows. + signed-off-by: Juan Cruz Viotti + subject: "chore: generate single-binary portable installers on Windows" + body: |- + We currently support portable builds that are basically ZIPs containing + the main Etcher executable and all its related libraries. + Turns out `electron-builder` supports NSIS-based portable builds that + can create a single executable that has everything it needs to run, + including any external assets. + This commit makes use of this new portable Windows installer + functionality, replacing the old ZIP approach. + - hash: d1fe3f309c72dd6cc479b271a5be1bf012255752 + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io/etcher/pull/1132#discussion_r121654527 + signed-off-by: Juan Cruz Viotti + subject: "chore: fix version/platform order inconsistencies in package names" + body: null + - hash: e9b9ef25e9ac8b2ffed84860873ee4845b32bfba + author: Andrew Scheller + subject: "chore: move `mkdir` call from node-package-cli.sh to Makefile" + body: This makes it more consistent with the other Makefile rules + - hash: c8e1db165c0a7e05c48aa944e4a1ff6f597703df + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io/etcher/pull/1382 + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: "refactor(GUI): replace SET_SETTING with an atomic SET_SETTINGS action" + body: |- + This commit is the first on a series of commit to incrementally + implement support for configuration files (so we avoid a huge PR like we + have at the moment). + Once of the first things we can do is replace the `SET_SETTING` redux + action with an atomic `SET_SETTINGS` action that sets all the settings + for the application at once. + The purpose of this change is that later the `SET_SETTINGS` action can + be modified to stringify all the settings and store them in a + configuration file, without having to deal with merges, conflicts, etc + (since the client application if forced to resolve those problems before + calling the `SET_SETTINGS` action.) + The behaviour of the code remains almost the same, with the exception + that the user can now set settings that we don't know about, so the user + can switch between Etcher versions without getting weird errors if one + of the configuration keys he has doesn't exist in the other version. + - hash: 56c7c2fc86e77d106b1289781fbf004025b18e38 + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io/etcher/pull/1505#pullrequestreview-43444274 + signed-off-by: Juan Cruz Viotti + subject: "chore: don't use ./ when generating sass files" + body: The `./` prefix is unnecessary. + - hash: 6d487612721fa31c6a99d963dc13111ada0a5403 + author: Shou + footers: + changelog-entry: Remove Angular dependency from DriveScanner. + subject: "refactor(GUI): remove angular dependency from drive scanner" + body: |- + Remove the Angular dependency from DriveScanner and with it the service, + exposing it through the module directly. + - hash: f3afdaedba40cfa0c391179bd6b4488cc9c561b3 + author: Shou + subject: tests fixed + body: null + - hash: 81dac8f7810f55543225b3f8547fc5acf57b708a + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + subject: "chore: use `electron-builder` to generate macOS builds" + body: |- + This commit makes use of electron-builder to replace what our scripts + were already doing. + - hash: 6c33b974b6a0ca98012a17f0a5d21ca30ccda8f5 + author: Juan Cruz Viotti + footers: + change-type: patch + fixes: https://github.com/resin-io/etcher/issues/877 + signed-off-by: Juan Cruz Viotti + subject: "chore: use the new `electron-builder` version to create NSIS installer" + body: |- + We've been using `electron-builder` v2 all this time to create the NSIS + installer. This commit upgrade `electron-builder` to v18.6.2, and keeps + using it just to create the NSIS installer (for now). + The final package behaves exactly like the one we have before, just that + we needed various tweaks to upgrade to the latest `electron-builder` + version. + In more detail: + - Inject data to package.json using the new `--extraMetadata` option + - Remove old `.builder` package.json property + - Change the author of the project to Resin Inc. (the company name used + in our code-signing certificate) + As an extra, the new NSIS installer allows the user to install the + application to any location, and fixes the fact that the previous + installer copied the application to C:\Program Files (x86) even on x64 + systems. + - hash: 451c1a36f366e0248718cbba79201218f4830e09 + author: Shou + footers: + changelog-entry: Remove Angular dependency from selection-state + subject: "refactor(GUI): remove angular dependency from selection-state" + body: |- + We remove the dependency on Angular from SelectionStateModel and rename + it to selectionState. + - hash: 51635fad204a7908c95af075e4707b7d42346f9f + author: Shou + subject: module.exports -> exports, this -> exports + body: null + - hash: 8f228c2ec655f8affa3729974bbe0f9d459ee7c1 + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + subject: "chore: output build artifacts to dist/" + body: |- + This is the directory where `electron-builder` will output build + artifacts. + - hash: f3a6d5dc4b34e6da4382d17ca9b122abf7cab2bd + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + subject: "chore: move npm targets to Makefile" + body: |- + We currently have various npm script target, and some of them are + getting complex enough that making sense out of them in package.json is + not a trivial task. + This commit moves all npm targets that are not directly recognisable by + npm (like `start`, `test`, `preshrinkwrap`, etc) into the Makefile. + - hash: 5c00ef38ca5565c9c19853891d136618cd9d067b + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + subject: "chore: re-organize package.json in a way similar to electron-builder" + body: |- + This commit re-organizes various metadata properties in package.json so + that the structure better matches what `electron-builder` expects, to + ease the transition. + - Move `.companyName` to the Makefile (we don't need this in + package.json) + - Move `.displayName` to `.build.productName` + - Move `.copyright` to `.build.copyright` + - Move category to `.build.mac.category` + - Move bundle id to `.build.appId` + - hash: 924c6779370f3fcc899f38f8ae1ffff85a3e9a9c + author: Juan Cruz Viotti + footers: + see: https://github.com/electron-userland/electron-builder/issues/517 + signed-off-by: Juan Cruz Viotti + subject: "chore: remove ampersand from package description" + body: |- + The ampersand confuses nupkg when generating Windows installers from + `electron-builder`. + The referenced issue talks about an issue where the ampersand is present + on the application name, but anything that gets into the `.nuspec` XML + file, including the description, triggers the issue. + - hash: 084b4dc3f861734ebce97a583049c1b8550cb94c + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + subject: "chore: remove unused `electron-packager` dependency" + body: |- + We're not using this development dependency anymore. Furthermore, we're + also not using the `packageignore.js` script, which was meant to be used + with `electron-packager`. + - hash: 123a2de6b769608d6705b8387ce757af6eaecab0 + author: Juan Cruz Viotti + footers: + change-type: minor + changelog-entry: Remove support for the `ETCHER_DISABLE_UPDATES` environment variable. + signed-off-by: Juan Cruz Viotti + subject: "refactor(GUI): move ETCHER_DISABLE_UPDATES into package.json" + body: |- + Etcher supports disabling the update notification dialog by setting the + `ETCHER_DISABLE_UPDATES` environment variable. + In order to simplify disabling updates for when these are managed by a + package manager (e.g. in a debian package), this removes support for the + `ETCHER_DISABLE_UPDATES` environment variable, and instead requires + packagers to tweak the `updates.enabled` property of the package.json + file, which is set to `true` by default. + We don't want to encourage end users to disable the update mechanism, so + the documention was removed from `USER-DOCUMENTATION.md`. This option + will remain as something only packagers should tweak. + - hash: a15b2f7e509906436c57ff11c528c490f447c66e + author: Juan Cruz Viotti + footers: + change-type: patch + changelog-entry: Fix occasional increased CPU usage because of perl regular + expression in macOS. + fixes: https://github.com/resin-io/etcher/issues/1288 + signed-off-by: Juan Cruz Viotti + subject: "upgrade: `drivelist` to v5.0.22" + body: "- https://github.com/resin-io-modules/drivelist/pull/168" + - hash: 9592168e5f08a99837bde473caf15897d2d0acc5 + author: Romain Bazile + footers: + change-type: minor + changelog-entry: Addition of .sdcard file support. + link: https://github.com/resin-io/etcher/issues/1360 + fixes: https://github.com/resin-io/etcher/issues/1361 + subject: "fix: addition of .sdcard file support" + body: null + - hash: 56fe413dbe89df53cb22b478ac451474fb712578 + author: Romain Bazile + subject: "minifix: tests for .sdcard file format" + body: null + - hash: 0a9f5d9a54d5f8b3341420b9ac23817f280cd729 + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "doc(README): Update & normalize badges" + body: |- + This updates & normalizes the badges in the README to all have + a consistent style and adds a release-badge pointing to the website. + - hash: 07e7f5ad222773b4f31575bfbc463ced68cea5af + author: Jonas Hermsmeier + footers: + change-type: patch + subject: "upgrade(package): Update node-sass to 4.5.3" + body: |- + This updates node-sass from v3.x to v4.x in anticipation + of addition of Electron ABI versions in an upcoming version. + - hash: 7ce76db8343bff2b9ebf81176a463ed86095c572 + author: Jonas Hermsmeier + footers: + change-type: upgrade + subject: "chore(package): Update mountutils to 1.2.0" + body: |- + This updates `mountutils` from 1.0.6 to 1.2.0, which includes + various fixes and adds AsyncWorkers: + - fix(windows): Replace use of `wsprintf()` + - fix(darwin): Add local context to avoid global state + - feat(src): Use Nan::AsyncWorker + - hash: d39b4ba7d7687a7eea72cbf7b8702f8ea122fb39 + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + subject: "chore: make use of resin.io's Docker base images" + body: |- + Resin.io already publishes multi-arch Docker base images running Jessie, + which is Debian version we wanted before falling back to Ubuntu 12.04. + The main reason behind this change is to be able to use other resin.io + base images (like ARM ones) without requiring a lot of per-base-image + changes. + - hash: 65e4a3935df0bf574e725fa08f47c02cfcf1a072 + - hash: 42eb348ff6542616a7d7f762f5c6f149d35dd1b9 + - hash: be1ee96bc1a8b16c76a89add381eb5de5c3f4394 + - hash: e3237d83e33774860c389c7d4b07021fc10d0311 + - hash: 5d230d85c2ba1218e7c6134bea6e5af4b37a2247 + - hash: 5ea92ca30f61aba3ebb32616fa9a5b3af5de25f8 + - hash: 52173c51aaa136d229ebc0c5c57bc4b9cea04ad3 + - hash: ec571752f5bb59b116814b761fed6208a0e550f8 + - hash: 947bdbf46dd707ee2acd11f518d6c917d82e5af0 + - hash: 346c5645fdc883837d9262741ecf82cee1717a89 + - hash: d7aca39d103afaf11d6035999eebe62dc5a9e9e2 + - hash: 3355e3c1568b418632654c327d6aadf4798a6503 + - hash: e983f33451ad1c28e7acfdc978dc18d9c3b33268 + - hash: 1e254721dbad59bf7864a7c56d26059ca0e8fe9e + - hash: f249bbde361b1a9abe22b1d8736a0cfc82f61e81 + - hash: 6bc39b3aad75615e3ebbf33db6739691c06bd471 + - hash: aa487d37473c17c0652f502339aeb1ca699e0437 + - hash: 0179813227eff6684815c75cadd4d5b9d2dfa354 + - hash: 99c26d7c23277a61439afc26c551a90d56a57727 + - hash: 7ac7f83456bac6b5a6bebbbe3c1feb48e9b83724 + - hash: 41280a44fdd2237ed81b63df607930cf7efbf077 + - hash: c0ac0ebf552b30ebea4a26911cf46ef3dfe42a85 + - hash: 6191b4cd28a2395b15ddb63a97c942f0afdd8178 + - hash: 1ee1de64edab924961ec22505c0c384cf59a2846 + - hash: 3b5623575d8538c1a8aa6890d41f31c1413165a1 + - hash: 29ee9421318ab40db25fad77a650a7017f981432 + - hash: c0a1f46a5f1be2f9efe60dccf658311e1e2e7659 + - hash: bc6ab6e3e0fc83430f8a32103ae1aae3daa9e781 + - hash: 1a814ff2130dbf7b239819387c9626171a269287 + - hash: 7bcd6d74844e7ce84548f1ba7a622c8ee2f0b47a + - hash: 9faf3ff17f309170622f022325cd976bce362284 + - hash: 0a54199105545f29e342ced6a668c73439a1d835 + - hash: 7ce5492194619f00422b37044c9962925b1c4639 + - hash: 8011c95563496eb29c6214b1bb1f07bc1adf6fe2 + - hash: 77f2d8988c91364c6a47b2c1a2a18b2dc3f9d4db + - hash: 19b3878d0c193808843aac1be67cf276b3eda081 + - hash: 3a5649471a44e21e1c288bdd6657243988a1b24b + - hash: 754b76f65e99a68b93b9260ddc8a1a7e6323f831 + - hash: 2dfd6e768da3dfa90e02a14ff74d56c7a87c1f98 + - hash: 97d8171ecd67ead461068d7131b5c21dd76b3097 + - hash: f52a373a9d844f9338d6c60fe40b5b69620ddc07 + - hash: 2cc010bd4db64996aab717e9009cccbcec7d0ca7 + - hash: 736820ebc906a733c6bd67cb1cd474ed2330f43f + - hash: e6dd1aeab8af6ba2ccc190a8cc2f9606f5035d35 + - hash: 72fdf501aa8515ca077670cea84733b07d059f2f + - hash: 56adc6a9ec6404db823f0dc60f3b1ac60bf323e5 + - hash: d2338d814e3aa601574f4845329a780266ce7d8f + - hash: 7e2d406b5b7b55a9bb62f6d476474ebb67b65b69 + - hash: cc6c0c6014efcee198cda195fef7dbfcd6e69835 + - hash: d600f8bc2f82c0d301271564837f4452e9aa1716 + - hash: aae9fea6c1e8fe5906683dae28cb220d72b6892f + - hash: 717a0f0500027f53e91c31eef3fc083fb6bb45c9 + - hash: 77a978a4272fadb4c845feb17a9c2a883e211854 + - hash: 245dcef0b81e612d8e36d587b73b7ba9f6790d88 + - hash: 0b688ab3ce0adf9b2efc330c73ac7fbb01838365 + - hash: 74766fba5fd3dbc8638398880d0a7f9a95ad013b + - hash: dbe07c8e827bcba528387d6356cad38278fee7d2 + - hash: 9c2e9109356c0902a5626bb55ddfd1507915c67e + - hash: 147caec6c4e08f320220cca785c20aaa16166668 + - hash: 2cd2b99c4bd27c2882ef765b5777437d4f48092d + - hash: 9fa7175a653ba7fd7242502675c265697b35fa91 + - hash: a92157c5ca8e1523de3ae4d847349c91f784465f + - hash: c81398e5d4db1ff1f2c3f3f8e62a95faf43d8bda + - hash: 581b48ffcf09e98b0b7249afba76366bd710d02d + - hash: 36aa922d23f98bb476b02646a5fdb81642f109fe + - hash: c16105dbef5af51d52ba582026a4f9ccc19ffec5 + - hash: 07c090a0d9d41365c23f5445023139edf49e6a09 + - hash: 4fd639efa0b126f33fa81a8dc5215af14957e7bf + - hash: eeff671809be0d7f806c5c34350c6688a779f085 + - hash: 4730273b14421748f04cc4246150217e1f60ab7c + - hash: 1867844d8d392eddf8423aa3cad8c3a754970e47 + - hash: 5cd27f33aa68e70f54cac369c72dc4c5b265e345 + - hash: c31257fd3db03437d4d3c6f75eb61e93ad010801 + - hash: 8aa7d5ea10a9a844425fa4b8ea0a9fe02c90ffd1 + - hash: f1d4ed4cbf42487b54ec838ed05c6f5d60d3771e + - hash: 81e14b61ae7278438a0241dc61549aecd88cebcc + - hash: 1cae7bd58393d2168faf482add0181336c73e2f0 + - hash: d418513200108c52fcf828abbe6249b13838ed2d + - hash: 959e43535f373ec9855d1a8b780122c35999183e + - hash: ebfd1e62e34165632e297012bc3dec33c2e0a733 + - hash: a407b1b187718f3ea566c4d82e25a9cfafc97371 + - hash: a7b811fe513122872ab6a66e508a844ed8c7fafd + - hash: 9b727b0c93ae762ff348f1db7c3a0c1e097f5ee0 + - hash: 1b98a25f4ce1e8026fa09e147e1aa34c20346df8 + - hash: e036345140cfbf640c31e3e4ca77028aba68d6aa + - hash: 778d4967b8d34b2abc544ccb93a3f3542cdda2a5 + - hash: 92df9e7d145c3105cbfd153e05a2e02f207db5ba +- version: 1.0.0 + date: 2017-05-12T04:40:08.000Z + commits: + - hash: 9a48dc9514e1b07e0ec41643bd5827b324194948 + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io-modules/etcher-latest-version + fixes: https://github.com/resin-io/etcher/issues/673 + change-type: minor + changelog-entry: Allow archive images to configure a certain amount of bytes to + be zeroed out from the beginning of the drive when using bmaps. + signed-off-by: Juan Cruz Viotti + subject: Rebuild pending SASS changes + body: null + - hash: 84e2454c731f69d9b7ab9d92b8411c9d5a5bf83f + author: Juan Cruz Viotti + footers: + change-type: patch + changelog-entry: Fix "Can't set the flashing state when not flashing" error. + fixes: https://github.com/resin-io/etcher/issues/251 + signed-off-by: Juan Cruz Viotti + subject: Invert progress bar stripes + body: Make the progress bar background striped, and the actual bar solid. + - hash: 9a7ac60cd0c08eaa3408123265333592c7cc378b + author: Juan Cruz Viotti + subject: Show drive name in drive selector modal + body: |- + The `name` property equals the drive letter in Windows, and the mount + point in UNIX based operating systems. + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + see: https://github.com/angular/angular.js/blob/master/CONTRIBUTING.md#commit + fixes: https://github.com/resin-io/etcher/issues/258 + changelog-entry: Fix `0x80131700` error when scanning drives on Windows. + - hash: c068d9b87e1ea9f358045ae5957fce480c335cb5 + author: Juan Cruz Viotti + footers: + change-type: patch + changelog-entry: Fix uncaught exception when showing the update notifier modal. + see: https://github.com/resin-io/etcher/issues/986 + signed-off-by: Juan Cruz Viotti + subject: Codesign OS X app inside the DMG package + body: >- + This PR fixes a frequent issue users were having where opening + + `Etcher.app` would result in: + + "Etcher.app" is damaged and can't be opened. You should move it to + + the trash. + + Checking the code-signature of the application returned the following + + error message: + + $ spctl -a -v Etcher.app + + Etcher.app: invalid signature (code or signature have been modified) + + The solution is based on the following paragraphs from Apple's "OS X + + Code Signing in Depth" technical note: + + https://developer.apple.com/library/mac/technotes/tn2206/_index.html + + > Code signing uses extended attributes to store signatures in + non-Mach-O + + > executables such as script files. If the extended attributes are lost + + > then the program's identity will be broken. Thus, when you ship your + + > script, you must use a mechanism that preserves extended attributes. + + > + + > One way to guarantee preservation of extended attributes is by packing + + > up your signed code in a read-write disk image (DMG) file before + signing + + > and then, after signing, converting to read-only. You probably don't + + > need to use a disk image until the final package stage so another less + + > heavy-handed method would be to use ZIP or XIP files. + + In summary, what we now do is: + + - Create a temporal read-write DMG image. + + - Perform the code-signing *inside* the DMG image. + + - Convert the temporal DMG image into a compressed read-only image. + + Sadly, this custom workflow doesn't fit in `electron-packager` nor + + `electron-builder`, so we had to re-implement the features those + + packages provide us in a nice encapsulated way ourselves. + - hash: b3431b77fb3b99b8caa9c097005ac7e084de476e + author: Juan Cruz Viotti + footers: + see: https://medium.com/@markelog/jscs-end-of-the-line-bc9bf0b3fdb2#.zbuwvxa5y + signed-off-by: Juan Cruz Viotti + closes: https://github.com/resin-io/etcher/issues/744 + change-type: minor + changelog-entry: Confirm before user quits while writing. + subject: Fix shell.openExternal() freezing GNU/Linux + body: |- + Electron's `shell.openExternal()` fails on GNU/Linux when Electron is + ran with `sudo`. The issue was reported, and this is a workaround until + its fixed on the Electron side. + `node-open` is smart enough to check the `$SUDO_USER` environment + variable and to prepend `sudo -u ` if needed. + We keep `shell.openExternal()` for OSes other than Linux since we intend + to fully rely on it when the issue is fixed, and since its closer + integration with the operating system might lead to more accurate + results than a third party NPM module. + See https://github.com/electron/electron/issues/5039 + - hash: 81b93d70fd8693489f793dcbfb7876212477085b + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + change-type: patch + see: https://github.com/resin-io/etcher/pull/997 + closes: https://github.com/resin-io/etcher/issues/839 + changelog-entry: Display `*.zip` in the supported images tooltip. + fixes: https://github.com/resin-io/etcher/issues/344 + subject: Log Etcher version in Mixpanel and TrackJS + body: |- + Its hard to attempt to debug or reproduce an issue if we don't know the + version the user is running. + - hash: 8dacc77e8a831714d29006ce900b49462c030568 + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io/etcher/pull/1365 + signed-off-by: Juan Cruz Viotti + change-type: minor + changelog-entry: Don't include user paths in Mixpanel usage reports + link: https://github.com/resin-io-modules/etcher-image-stream/blob/master/CHANGELOG.md + subject: Fix uncaught exception if no file was selected from a dialog + body: |- + The following error is thrown if the open file dialog is cancelled + without any selection: + Unhandled rejection TypeError: Cannot read property '0' of undefined + at Number.indexedGetter (/home/parallels/Projects/etcher/node_modules/bluebird/js/release/call_get.js:106:15) + at Number.tryCatcher (/home/parallels/Projects/etcher/node_modules/bluebird/js/release/util.js:16:23) + at Promise._settlePromiseFromHandler (/home/parallels/Projects/etcher/node_modules/bluebird/js/release/promise.js:503:31) + at Promise._settlePromise (/home/parallels/Projects/etcher/node_modules/bluebird/js/release/promise.js:560:18) + at Promise._settlePromise0 (/home/parallels/Projects/etcher/node_modules/bluebird/js/release/promise.js:605:10) + at Promise._settlePromises (/home/parallels/Projects/etcher/node_modules/bluebird/js/release/promise.js:684:18) + at Async._drainQueue (/home/parallels/Projects/etcher/node_modules/bluebird/js/release/async.js:126:16) + at Async._drainQueues (/home/parallels/Projects/etcher/node_modules/bluebird/js/release/async.js:136:10) + at Immediate.Async.drainQueues [as _onImmediate] (/home/parallels/Projects/etcher/node_modules/bluebird/js/release/async.js:16:14) + at processImmediate [as _immediateCallback] (timers.js:383:17) + - hash: 6bd086f1c5c6654a47125cf2d46788655cae2553 + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + see: https://github.com/resin-io-modules/etcher-image-write/pull/45 + change-type: patch + changelog-entry: Show device id if device doesn't have an assigned drive letter + in Windows. + fixes: https://github.com/resin-io/etcher/issues/396 + subject: Enable useContentSize BrowserWindow option + body: >- + From the documentation: + + > `useContentSize` Boolean - The `width` and `height` would be used as + web + + > page’s size, which means the actual window’s size will include window + + > frame’s size and be slightly larger. Default is `false`. + + The original issue is that when you specify a width/height, the actual + + size that you get is slighly smaller, since the OS title bar is included + + in the size you provide. + + By using the `useContentSize` option, we ensure the `WebView` gets the + + intended size, no matter the title bar. + + This PR invalidates: https://github.com/resin-io/etcher/pull/244 + - hash: 1f79012b9598071e65eb4a7953d2a97da44beaf3 + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io-modules/etcher-image-write/pull/70 + signed-off-by: Juan Cruz Viotti + fixes: "#859" + change-type: patch + changelog-entry: 'Fix sporadic "EIO: i/o error, read" errors during validation.' + subject: Undo `:focus` styles from Bootstrap. + body: |- + On Electron, the user can click and press over a button, + then move the mouse away from the button and release, + and the button will erroneusly keep the `:focus` state style. + The current workaround consists of: + - Iterate through all the Bootstrap button styles. + - Set the default 'background', `color` and `border-color` to match the + style of the normal state. + - hash: 7a89eb37145c9ea395be71ab8873d42313b59318 + author: Juan Cruz Viotti + footers: + see: https://github.com/blog/2111-issue-and-pull-request-templates + fixes: https://github.com/resin-io/etcher/issues/1109 + change-type: patch + changelog-entry: Fix `ENOSPC` image alignment errors. + signed-off-by: Juan Cruz Viotti + subject: Extend ProgressButton to support a striped progress bar + body: This feature will be used to implement the burn validation step. + - hash: 76645a7ec5fc53de7bceab11c73104f2a7f4a846 + author: Juan Cruz Viotti + footers: + see: https://github.com/mishoo/UglifyJS2/tree/harmony + signed-off-by: Juan Cruz Viotti + change-type: patch + changelog-entry: Fix writing process remaining alive after the GUI is closed. + fixes: https://github.com/resin-io/etcher/issues/850 + subject: Implement alert-ribbon CSS component + body: |- + This component will be used to inform an error situation to the user + during the burn/check processes. + - hash: 628587d23c8b2c0664fcec51711e5ffae7e33f81 + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io/etcher/pull/1379 + signed-off-by: Juan Cruz Viotti + change-type: patch + changelog-entry: Fix "Invalid message" error caused by the IPC client emitting + multiple JSON objects as a single message. + fixes: https://github.com/resin-io/etcher/issues/472 + subject: Add "Enable write validation on success" setting + body: null + - hash: 00d163125525bfe0d8d99bc7be669942424a7be5 + author: Juan Cruz Viotti + subject: Implement write validation support + body: null + footers: + change-type: patch + changelog-entry: Fix unmount issues in GNU/Linux and OS Xwhen paths contain spaces. + signed-off-by: Juan Cruz Viotti + fixes: https://github.com/resin-io/etcher/issues/45 + - hash: 617cbb1d6db117a8bf3d17451a8f2c4aa31b2bac + author: Juan Cruz Viotti + subject: Move application images to assets/ + body: null + footers: + change-type: patch + changelog-entry: Add referers to the etcher.io links + signed-off-by: Juan Cruz Viotti + see: https://github.com/resin-io/etcher/issues/632 + closes: https://github.com/resin-io/etcher/issues/987 + - hash: da04c9a34b234282e447cd04a6e55a2916dab443 + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io/etcher/pull/1366 + signed-off-by: Juan Cruz Viotti + change-type: patch + changelog-entry: Don't interpret certain ISO images as unsupported. + subject: Split DriveSelector components into separate files + body: null + - hash: a201566d458077f5cd9b62d2f22d7719bd540caa + author: Juan Cruz Viotti + footers: + changelog-entry: Rename and de-angularise AnalyticsService to analytics + see: https://github.com/stedolan/jq/issues/1155 + signed-off-by: Juan Cruz Viotti + change-type: patch + fixes: https://github.com/resin-io/etcher/issues/729 + subject: Mark DriveScannerService.setDrives() as private + body: null + - hash: 71dd113c2078715cd8ea31a337df063f8ad89644 + author: Juan Cruz Viotti + subject: Implement `showIfState` and `hideIfState` directives + body: |- + This directives will be used in the header navigation instead of + re-using this logic from the `NavigationController`. + A consequence of this change is that `NavigationController` is no longer + needed, and therefore is removed. + footers: + signed-off-by: Juan Cruz Viotti + see: https://github.com/resin-io/etcher/pull/1111#discussion_r103483879 + change-type: patch + - hash: 2c7421d91772e39dca528760a7a73d25353615af + author: Juan Cruz Viotti + footers: + see: https://github.com/caskroom/homebrew-cask/pull/26319 + signed-off-by: Juan Cruz Viotti + change-type: patch + subject: Implement an `openExternal` attribute directive. + body: |- + This directive will be used in the header and footer instead of having + to rely on `NavigationController` to expose `shell.openExternal`. + - hash: 1a99e190648b598937c3fe35e6ec60ccb50efe8d + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + see: https://github.com/resin-io/etcher/pull/1264/files#r110662965 + change-type: patch + subject: Decouple DriveScannerService from Dialog + body: null + - hash: 60b6d6a71a5aedec75d7c7fd55d36cf4aea5f150 + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + see: https://github.com/resin-io/etcher/pull/1262#discussion_r110541438 + change-type: patch + fixes: https://github.com/resin-io/etcher/issues/685 + changelog-entry: Fix "Not Enough Space" error when flashing unaligned images. + subject: Convert SelectionStateService into a model + body: null + - hash: 7a4e36968e3a0a0ac4cc27fc2936005094b1cf91 + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io/etcher/pull/1183 + signed-off-by: Juan Cruz Viotti + change-type: patch + changelog-entry: "Fix `blkid: command not found` error in certain GNU/Linux + distributions." + fixes: https://github.com/resin-io/etcher/issues/640 + subject: Extract browser window progress into WindowProgressService + body: null + - hash: 5db6c02435d7fdee1ffe5dd91a0acac411b8622c + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + see: https://github.com/resin-io/etcher/issues/888 + changelog-entry: Fix incorrect estimated entry sizes in certain ZIP archives. + change-type: patch + fixes: https://github.com/resin-io/etcher/issues/644 + subject: Transform SettingsService into the SettingsModel module + body: null + - hash: 6ef34608f341614e4101cc7e4dbd2b8ee5bb10b9 + author: Juan Cruz Viotti + footers: + change-type: patch + changelog-entry: Prevent `ENOSPC` if the drive capacity is equal to the image size. + signed-off-by: Juan Cruz Viotti + see: https://github.com/resin-io/etcher/issues/797 + fixes: https://github.com/resin-io/etcher/issues/378 + subject: Add vertical spacing to unmount on success message on finish screen + body: null + - hash: cbbf4aed41f38b5de37716ee07c5e5fc5e16695c + author: Juan Cruz Viotti + footers: + changelog-entry: Add a dynamic finish page. + change-type: patch + signed-off-by: Juan Cruz Viotti + see: https://github.com/resin-io/etcher/issues/797 + fixes: https://github.com/resin-io/etcher/issues/630 + subject: Use SettingsService in FinishController + body: |- + EXposing the settings from the `FinishController` is a better approach + that instantiating the `SettingsController` in the Finish page template. + - hash: b81343b4cd8db6f3f0ee97b43771dcca2daa515d + author: Juan Cruz Viotti + subject: Move all settings related components to a settings page subdirectory + body: null + footers: + signed-off-by: Juan Cruz Viotti + see: https://github.com/resin-io/etcher/issues/729 + - hash: 43bafbe43b13d1ebd0ca51b4463b695837362a1e + author: Juan Cruz Viotti + subject: Group finish page components in a common directory + body: null + footers: + see: https://github.com/resin-io/etcher/issues/632 + signed-off-by: Juan Cruz Viotti + change-type: patch + changelog-entry: Prevent failed validation due to drive getting auto-mounted in + GNU/Linux. + fixes: https://github.com/resin-io/etcher/issues/574 + - hash: dabdceae245e799b700642b764612cc4ea4278d8 + author: Juan Cruz Viotti + subject: Group all parts of the progress-button component in a single directory + body: null + footers: + see: https://github.com/resin-io-modules/drivelist/pull/146 + change-type: patch + changelog-entry: Upgrade `drivelist` to v3.3.0. + signed-off-by: Juan Cruz Viotti + - hash: 396d3ecc731e49f6bab929557698cfa569973c1f + author: Juan Cruz Viotti + subject: Implement a drive selector modal + body: |- + This modal provides a more advanced way to select a drive. It prevents + certain issues the dropdown was having, like the contents overflowing + when there were many connected drives. + footers: + changelog-entry: Improve speed when retrieving archive image metadata. + signed-off-by: Juan Cruz Viotti + change-type: patch + fixes: https://github.com/resin-io/etcher/issues/202 + - hash: 8b4076b418878b8ad64241dde6e33e2902533e77 + author: Juan Cruz Viotti + subject: Make a CSS class for fixed-width step buttons + body: null + footers: + see: https://github.com/resin-io/etcher/pull/1228 + signed-off-by: Juan Cruz Viotti + change-type: patch + fixes: https://github.com/resin-io/etcher/issues/634 + changelog-entry: Improve image full file name modal tooltip. + - hash: 85d1c16dccafb66fed94e4cf7eba7df4606f9abd + author: Juan Cruz Viotti + subject: Style btn-sm + body: null + footers: + change-type: patch + changelog-entry: Fix "`modal.dismiss` is not a function" exception. + signed-off-by: Juan Cruz Viotti + - hash: 12f92c80247a9861a18ba82ba1cb3514636a247c + author: Juan Cruz Viotti + subject: Fix step vertical bars slight misalignment + body: null + footers: + see: https://github.com/resin-io/etcher/pull/1120 + signed-off-by: Juan Cruz Viotti + fixes: https://github.com/resin-io/etcher/issues/171 + change-type: minor + changelog-entry: Add `.bmap` support. + - hash: 714769511d1417b427f3468f90ada7ec8916fd27 + author: Juan Cruz Viotti + subject: Merge src/drives.js with DriveScannerService + body: |- + `src/drives.js` made little on its own, and only caused extra thinking + overhead due to indirection. + footers: + changelog-type: Bound flash progress percentage within 0-100 range. + signed-off-by: Juan Cruz Viotti + see: https://github.com/resin-io/etcher/issues/171 + change-type: minor + changelog-entry: Upgrade `etcher-image-stream` to v3.1.0. + link: https://github.com/resin-io-modules/etcher-image-stream/blob/master/CHANGELOG.md + - hash: f6916b02fb21c711a8333dc009ebcacb87299627 + author: Juan Cruz Viotti + subject: Fix "Use same image" not preserving the image selection + body: null + footers: + change-type: minor + changelog-type: Update flashing step's icon to a lightning strike. + signed-off-by: Juan Cruz Viotti + fixes: https://github.com/resin-io/etcher/issues/348 + - hash: 880afa1dad75139f59290827bc2ec3a3f8fe2889 + author: Juan Cruz Viotti + subject: Refactor badge as a scss component + body: null + footers: + changelog-entry: Update the old image step icon with 'plus' icon. + signed-off-by: Juan Cruz Viotti + fixes: https://github.com/resin-io/etcher/issues/509 + see: https://github.com/resin-io/etcher/issues/325 + - hash: cd9f0e97600b293255354687f0358f86b3fd92a8 + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + change-type: patch + changelog-entry: Omit empty SD Card readers in the drive selector on Windows. + see: https://github.com/resin-io/etcher/pull/795 + subject: Refactor caption as a scss component + body: null + - hash: f2c627df69b23882fe9f61c759899ee2f540a4f1 + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + see: https://github.com/resin-io/etcher/issues/787 + subject: Refactor hero-button as a scss component + body: null + - hash: 731488e0fa64bb64e98b9911dadabccedc8d476a + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + see: https://github.com/resin-io/etcher/pull/1110 + subject: Refactor tick as a scss component + body: null + - hash: e7d668336c982feaf8500071050d02a64cc22a0a + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + change-type: patch + see: https://github.com/resin-io/etcher/pull/783#issuecomment-256959050 + subject: Move title normalisation to desktop.css + body: null + - hash: c0c70c60104ffce55c208d6c7ad03494854a5fd0 + author: Juan Cruz Viotti + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + see: https://github.com/resin-io-modules/etcher-image-stream/pull/10 + changelog-entry: Prevent selected drive from getting auto-removed when + navigating back to the main screen from another screen. + closes: https://github.com/resin-io/etcher/issues/491 + subject: Convert hero-progress-button into an Angular directive + body: null + - hash: bb7aa570a5dd3c8f401d0846ed810b972e55ce60 + author: Juan Cruz Viotti + footers: + change-type: minor + changelog-entry: Show "Unmounting..." while unmounting a drive. + signed-off-by: Juan Cruz Viotti + see: https://github.com/npm/npm/issues/2679 + subject: Make caption's uppercase by default + body: null + - hash: 817d97e12e4fb27541923562bf02749f2c9b2561 + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io/etcher/pull/1319 + signed-off-by: Juan Cruz Viotti + fixes: https://github.com/resin-io/etcher/issues/801 + change-type: patch + changelog-entry: Fix new available drives not being recognised automatically in Windows. + subject: Normalise step footers captions + body: null + - hash: 504db0dea9d9099e140736776c55ed3256f08464 + author: Juan Cruz Viotti + footers: + change-type: patch + changelog-entry: Fix application stuck at "Finishing". + signed-off-by: Juan Cruz Viotti + see: https://github.com/resin-io/etcher/issues/573 + subject: Move Boostrap style customisations to a boostrap.scss file + body: null + - hash: 447217db9f62ef91b7446e506c32d589254fad6b + author: Juan Cruz Viotti + footers: + change-type: patch + changelog-entry: Display an error if no graphical polkit authentication agent was found. + signed-off-by: Juan Cruz Viotti + fixes: https://github.com/resin-io/etcher/issues/1019 + see: https://github.com/jorangreef/sudo-prompt/pull/29 + subject: Remove unnecessary empty line in success partial + body: null + - hash: 156d5d15d8015db80f8447eccb69261c4fefce66 + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io-modules/drivelist/pull/86 + signed-off-by: Juan Cruz Viotti + change-type: patch + changelog-entry: Fix internal removable drives considered system drives in macOS Sierra. + fixes: https://github.com/resin-io/etcher/issues/173 + subject: Setup code-signing in Windows + body: null + - hash: 66d8983fc4320f241dd75269bf899a337ebdd5a7 + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + see: https://github.com/resin-io/etcher/issues/127 + change-type: patch + changelog-entry: Upgrade `etcher-image-write` to v6.0.1. + link: https://github.com/resin-io-modules/etcher-image-write/blob/master/CHANGELOG.md + subject: Add missing package metadata + body: |- + - Legal copyright. + - Company name. + - File description. + - Original filename. + - Product name. + - Internal name. + - hash: b4699105e782188dab080debb341a6880e5eca74 + author: Juan Cruz Viotti + subject: Remove .travis.yml deploy section + body: |- + Deploy will be done locally for now given security concerns with CI + servers and certificates. + footers: + see: https://docs.npmjs.com/cli/shrinkwrap + signed-off-by: Juan Cruz Viotti + changelog-entry: Upgrade `removedrive` to v1.0.0. + fixes: https://github.com/resin-io/etcher/issues/289 + change-type: patch + link: https://github.com/jviotti/removedrive/blob/master/CHANGELOG.md + - hash: 5f9a26018c022b790c42885127f67d8d30abcaba + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + see: https://github.com/resin-io/etcher/issues/609 + fixes: https://github.com/resin-io/etcher/issues/215 + change-type: patch + changelog-entry: Fix duplicate drives in Windows. + subject: Return to avoid any further code execution after an elevation error + body: |- + Turns out that even by using `process.exit(1)`, the electron main + process doesn't exit instantly, but continues executing code. + This causes electron to throw on `electron.globalShortcut` because this + functionality is not available given that we didn't create a renderer + view. + - hash: a90275144fe600df623bb0e86cdc4f4339f1cd27 + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + see: https://github.com/resin-io/etcher/pull/764 + fixes: https://github.com/resin-io/etcher/issues/492 + subject: Upgrade drivelist to v2.0.9 + body: |- + This new version contains various fixes to better detect removable + drives. + - hash: 0a8617efd2470cd34b36081e276cde3799783418 + author: Juan Cruz Viotti + footers: + see: https://github.com/angular/angular.js/pull/13662 + signed-off-by: Juan Cruz Viotti + change-type: patch + changelog-entry: Fix duplicate error messages + fixes: https://github.com/resin-io/etcher/issues/1082 + subject: Implement validation support in Etcher CLI + body: null + - hash: 3cc6a052b1227d0cd1e88cfd618bad08b48ec004 + author: Juan Cruz Viotti + subject: Implement Etcher CLI "robot" option + body: |- + This option makes the Etcher CLI outputs state information in a way that + can be easily parsed by a parent process spawning it. + The format of the state output is: + % s + This can be easily parsed as follows: + const output = line.split(' '); + const state = { + type: output[0], + percentage: parseInt(output[1], 10), + eta: parseInt(output[2], 10), + speed: parseInt(output[3], 10) + }; + footers: + signed-off-by: Juan Cruz Viotti + - hash: 2a14a984388cbdfbdd9e15eb714b1fe294b9a86d + author: Juan Cruz Viotti + footers: + change-type: patch + changelog-entry: Fix "Unmount failed" on Windows where the PC is connected to + network drives. + signed-off-by: Juan Cruz Viotti + subject: Fix lint warnings + body: "- `os` in unused in `byte-size.spec.js`" + - hash: f56baf4b2ac8c87c31b2b0371c0106fca3683a89 + author: Juan Cruz Viotti + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + subject: Move GUI code into lib/gui + body: |- + This refactoring will be useful on future changes, where there will be + a single application entry point that will execute the CLI or the GUI + version depending on the environment. + - hash: 9e3ae993750f30ffb1450ad78443977bd728eeda + author: Juan Cruz Viotti + footers: + change-type: patch + see: https://github.com/mapbox/node-pre-gyp/issues/281 + signed-off-by: Juan Cruz Viotti + fixes: https://github.com/resin-io/etcher/issues/773 + changelog-entry: Only enable error reporting if running inside an `asar`. + subject: Deprecate tar.gz GNU/Linux "installers" + body: We're distributing AppImages now for convenience. + - hash: 1e3d262c24abd3cdb01f4bbd8a7ce80e87140810 + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + change-type: minor + see: https://github.com/resin-io/etcher/pull/913#discussion_r90801230 + changelog-entry: Perform drive auto-selection even when there is no selected image. + subject: Upgrade drivelist to v3.0.0 + body: |- + This new version reports the size as a number of bytes instead of a + human readable string, so we have to take care of converting back to a + readable GB format ourselves. + - hash: 0b094bb50ce426b4628934fa9a7b9f62a7df850c + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + closes: https://github.com/resin-io/etcher/issues/1170 + changelog-entry: Fix "backdrop click" uncaught errors on modals. + see: https://github.com/resin-io/etcher/pull/934#issuecomment-264862767 + change-type: patch + subject: "Fix Error: Cannot find module `../global-shortcut` in Windows" + body: |- + Since the Electron upgrade, Windows users are hitting a weird error + about `global-shortcut` not existing. + A solution is to `require('global-shortcut')` instead of accessing it as + a property of `electorn`. + - hash: 56ea1d183c0c320d72017897c9dff37eeb449f28 + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io/etcher/pull/923#discussion_r90571316 + change-type: patch + changelog-entry: Upgrade `drivelist` to v3.2.4. + signed-off-by: Juan Cruz Viotti + fixes: https://github.com/resin-io/etcher/issues/1225 + subject: Integrate Etcher CLI in the main repository + body: |- + This PR integrates the Etcher CLI code-wise, but doesn't yet handles the + distribution part of the story. + - hash: 8c110c8ffa60f3da345b72d1f984822b4885cc4b + author: Juan Cruz Viotti + footers: + change-type: patch + see: https://github.com/resin-io/etcher/pull/923#discussion_r90570968 + fixes: https://github.com/resin-io/etcher/issues/418 + signed-off-by: Juan Cruz Viotti + changelog-entry: Fix Etcher leaving zombie processes behind in GNU/Linux. + subject: Upgrade Electron to v0.37.6 + body: |- + The main motiviation for such upgrade is that an error manifesting + itself as `Cannot read property 'object' of undefined` on certain Linux + systems was fixed in v0.37.4. + See https://github.com/electron/electron/issues/5229 + - hash: aeb9bc70cf966d546071121318a9ba6682c5d52a + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io/etcher/pull/1304 + signed-off-by: Juan Cruz Viotti + fixes: https://github.com/resin-io/etcher/issues/642 + change-type: patch + changelog-entry: Escape quotes from image paths to prevent Bash errors on + GNU/Linux and OS X. + subject: Make use of shell module by requiring `shell` + body: |- + Otherwise we get a strange issue when trying to stub it: + TypeError: Attempted to wrap undefined property openExternal as function + - hash: 332f1748726be0f9f7d48604326c4c9c41fa1f7b + author: Juan Cruz Viotti + subject: Add Makefile rule to generate an x86 AppImage for GNU/Linux + body: null + footers: + change-type: minor + changelog-entry: Support rich image extensions. + signed-off-by: Juan Cruz Viotti + fixes: https://github.com/resin-io/etcher/issues/470 + - hash: be8a52a36bd4283574b36fa5e11f84899cccfaae + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io/etcher/pull/1061 + signed-off-by: Juan Cruz Viotti + change-type: patch + changelog-entry: Show available Etcher version in the update notifier. + link: https://github.com/resin-io-modules/etcher-image-stream/blob/master/CHANGELOG.md + fixes: https://github.com/resin-io/etcher/issues/410 + subject: Distinguish between flash and validation events in Mixpanel + body: null + - hash: ccd816aa0829cdd14990f60138b72a7c00ab086f + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io/etcher/commit/bc6e51996441ce50cd5998712f79e15b6bf6499b#commitcomment-17164442 + signed-off-by: Juan Cruz Viotti + change-type: minor + changelog-entry: Use info icon instead of "SHOW FULL FILE NAME" in first step. + fixes: https://github.com/resin-io/etcher/issues/458 + subject: Make use of AppImage desktop integration script + body: |- + This is useful to prompt the user to install the `.desktop` file. + The `Description` key in `Etcher.desktop` was changed to `Comment` since + `desktop-file-validate` complained with: + Etcher.desktop: error: file contains key "Description" in group "Desktop + Entry", but keys extending the format should start with "X-" + After checking the desktop file format specification, the correct key + should be "Comment" + (https://specifications.freedesktop.org/desktop-entry-spec/latest/ar01s05.html). + - hash: c3e360e61933ef0044c005b5e92c879ff9a47c49 + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io-modules/elevator/pull/12 + signed-off-by: Juan Cruz Viotti + fixes: https://github.com/resin-io/etcher/issues/323 + change-type: minor + changelog-entry: Publish standalone Windows builds. + subject: Generate AppImage package for GNU/Linux x86_64 + body: null + - hash: 7e6741494a0fbfc18d0f2ab3bb59e0ac4d5bab3b + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io/etcher/pull/1326 + signed-off-by: Juan Cruz Viotti + fixes: https://github.com/resin-io/etcher/issues/830 + change-type: minor + changelog-entry: Prevent flashing the drive where the source image is located. + subject: Allow to bypass elevation with an environment variable + body: |- + This is mostly used for debugging purposes, or by power users that know + what they're doing. + - hash: ae7e82750c6d75d952225c392e30981d79eb0ec4 + author: Juan Cruz Viotti + footers: + change-type: patch + changelog-entry: Fix drag and drop not working anymore. + signed-off-by: Juan Cruz Viotti + fixes: https://github.com/resin-io/etcher/issues/1028 + subject: Remove unnecessary fields from `bower.json`. + body: |- + We don't distribute the application through bower, and removing stuff + means one less place to be concerned about certain meta-data to be in + sync. + - hash: c7d28dd5af73772f39c1b8e9ce33f2522615aa97 + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io-modules/etcher-image-stream/pull/21 + signed-off-by: Juan Cruz Viotti + fixes: https://github.com/resin-io/etcher/issues/334 + changelog-entry: Add support for `raw` images. + change-type: minor + subject: Refactor initial elevation routine + body: null + - hash: e1f78483ba7b641cb6ab0e8e83c42571b81f7182 + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + change-type: patch + see: https://github.com/npm/npm/issues/4984 + fixes: https://github.com/resin-io/etcher/issues/338 + subject: Add dashed underline to footer links + body: null + - hash: 24216e4eeda9a0477e9577d316decc6fa971d8c8 + author: Juan Cruz Viotti + footers: + change-type: minor + changelog-entry: Display a nice alert ribbon if drive runs out of space. + see: https://github.com/resin-io/etcher/issues/571 + signed-off-by: Juan Cruz Viotti + fixes: https://github.com/resin-io/etcher/issues/294 + subject: Improve UX when closing the drive selector modal + body: |- + The current "Close" button makes it confusing to the user to know if + he's accepting his changes, or just discarding them. + The "Close" button in the top right corner was replaced with a standard + cross icon, and there is a new "Continue" block button fixed in the + bottom of the modal. + - hash: 0113927ba57ac7cc48f6eda66742614c880f7681 + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + change-type: minor + closes: https://github.com/resin-io/etcher/issues/905 + changelog-entry: Validate the existence of the passed drive. + fixes: https://github.com/resin-io/etcher/issues/756 + subject: Link the version string in the footer to the CHANGELOG + body: null + - hash: d8865ee08e0e22565aad0606658b73f729399f0c + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + change-type: patch + subject: Implement ManifestBind directive + body: |- + This directive is useful to bind the contents of an element to a + property in the `package.json` manifest. + - hash: 5f46ca1edcc98e712b8b94e8c99c37b203f86daf + author: Juan Cruz Viotti + footers: + change-type: patch + changelog-entry: Capitalize every text throughout the application. + signed-off-by: Juan Cruz Viotti + fixes: https://github.com/resin-io/etcher/issues/292 + see: https://github.com/resin-io/etcher/issues/750 + subject: Add application version to footer + body: null + - hash: 0f80ce8cfc7ba6fa69a3a95c20fc9dc1c5e42a8b + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + change-type: patch + changelog-entry: Don't clear selection state when re-selecting an image. + fixes: https://github.com/resin-io/etcher/issues/307 + subject: Upgrade resin-image-write to v3.0.3 + body: |- + This new version contains a fix for the `stream.push() after EOF` error + hit when writing unaligned images. + - hash: 9e1f068b565ca00b3091391a95303a64814f9722 + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + change-type: minor + see: https://github.com/resin-io/etcher/commit/e603cb0838b005f1c8430bbce4c98b431d9c1ba9 + changelog-entry: Add support for `etch` images. + fixes: https://github.com/resin-io/etcher/issues/327 + subject: Reset writer state on flash error + body: |- + Not doing so leads the writer state to have a `progress` of `100%`, + while `isFlashing()` is `false`, which is an inconsistent state. + - hash: 3f7de530a8cb9db61d25d3a8ee23da3e99e14c14 + author: Juan Cruz Viotti + footers: + change-type: patch + changelog-entry: Check if drive is large enough using the final uncompressed + size of the image. + see: https://github.com/addaleax/lzma-native/issues/25 + signed-off-by: Juan Cruz Viotti + fixes: "#571" + subject: Fix double-quote lint warnings + body: null + - hash: 43667ba53feaa41147d4bbb1077ec894b3e9d894 + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io-modules/mountutils + signed-off-by: Juan Cruz Viotti + change-type: minor + changelog-entry: Fix several unmount related issues in all platforms. + fixes: https://github.com/resin-io/etcher/issues/750 + subject: Inherit current scope in osOpenExternal directive + body: |- + This directive attempts to create a new isolated scope, which leads the + errors when using this directive on top of another directive in the same + element. + - hash: e3adf0590239260349ae088e079826d25b91de13 + author: Juan Cruz Viotti + subject: Implement SVGIcon Angular directive + body: This directive replaces part of `hero-icon`, the old Polymer component. + footers: + change-type: patch + fixes: https://github.com/resin-io/etcher/issues/256 + changelog-entry: Swap the order of the drive and image selection steps. + signed-off-by: Juan Cruz Viotti + - hash: d8d0ef145b672405874e34a68a38401b82cd37be + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io-modules/mountutils/pull/25 + signed-off-by: Juan Cruz Viotti + fixes: https://github.com/resin-io/etcher/issues/480 + change-type: minor + changelog-entry: Add an "unsafe" option to bypass drive protection. + subject: Fix lint warnings about missing empty line above `module.exports` + body: null + - hash: 5f2b33717c9dc94eff29abca44c48673a9dbd91c + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io-modules/etcher-image-write/pull/96 + change-type: patch + changelog-entry: Upgrade `drivelist` to v3.2.2. + signed-off-by: Juan Cruz Viotti + fixes: https://github.com/resin-io/etcher/issues/430 + link: https://github.com/resin-io-modules/drivelist/blob/master/CHANGELOG.md + subject: Re-build CSS + body: null + - hash: 73b706ca52d06afb30e4746031a6d87389675e28 + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io-modules/elevator/pull/10 + signed-off-by: Juan Cruz Viotti + change-type: minor + subject: Require ui.router and ui.bootstrap using NPM style + body: null + - hash: 65acf6446650404748915f1eec621f669c480555 + author: Juan Cruz Viotti + footers: + change-type: patch + changelog-entry: Upgrade `etcher-image-write` to v5.0.2 + signed-off-by: Juan Cruz Viotti + link: https://github.com/resin-io-modules/etcher-image-write/blob/master/CHANGELOG.md + see: https://github.com/resin-io/etcher/issues/571 + subject: Document directives with JSDoc + body: null + - hash: 3539ee4ec70d555d416ec65bb5e0ab802e8d979f + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io/etcher/pull/896#discussion_r89999295 + signed-off-by: Juan Cruz Viotti + change-type: minor + changelog-entry: Show warning when user tries to flash a Windows image + closes: https://github.com/resin-io/etcher/issues/1035 + fixes: https://github.com/resin-io/etcher/issues/725 + subject: Don't require angular-ui-bootstrap in main module + body: This dependency is only required by `Etcher.Components.DriveSelector`. + - hash: 92dee5304c9c610c61e103c4763f81d226b0ccf5 + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + change-type: patch + changelog-entry: Fix flashing never starting after elevation in GNU/Linux. + fixes: https://github.com/resin-io/etcher/issues/665 + subject: Make all angular modules export the name of the module + body: |- + This makes them very nicely require-able, for example: + angular.module('MyModule', [ + require('my-dependency'); + ]); + From https://medium.com/@kentcdodds/how-to-distribute-your-angularjs-module-e04d4dd58ddc#.yqg2zo8im + - hash: b8f63af3f81bca3abd055303bc91ab35eb126655 + author: Juan Cruz Viotti + footers: + change-type: patch + signed-off-by: Juan Cruz Viotti + fixes: https://github.com/resin-io/etcher/issues/627 + link: https://github.com/resin-io-modules/etcher-image-write/blob/master/CHANGELOG.md + changelog-entry: Fix sporadic EPERM write errors on Windows. + subject: Promisify `drivelist.list()` with `angular-q-promisify` + body: null + - hash: 3a92e202b6eebb59403e830a975b127e660c57d4 + author: Juan Cruz Viotti + subject: Reorganize utilities and desktop integration modules + body: |- + - Rename `Etcher.Utils.Dropzone` to `Etcher.OS.Dropzone` + - Rename `Etcher.Utils.OpenExternal` to `Etcher.OS.OpenExternal` + - Rename `Etcher.Utils.WindowProgress` to `Etcher.OS.WindowProgress` + - Rename `Etcher.notification` to `Etcher.OS.Notification` + - Rename `Etcher.notifier` to `Etcher.Utils.Notifier` + - Rename `Etcher.path` to `Etcher.Utils.Path` + footers: + see: https://github.com/resin-io/etcher/issues/711 + signed-off-by: Juan Cruz Viotti + change-type: patch + changelog-entry: Don't throw an "Invalid image" error if the extension is not in + lowercase. + fixes: https://github.com/resin-io/etcher/issues/567 + - hash: ba2b78db82dd0f558bc793eb4f3f3c40119e9236 + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io-modules/drivelist/pull/95 + signed-off-by: Juan Cruz Viotti + change-type: patch + changelog-entry: Fix "cscript is not recognised as an internal or external + command" Windows error. + fixes: https://github.com/resin-io/etcher/issues/314 + subject: Publish ZIP versions of Etcher.app + body: "`Squirrel.Mac` works with ZIP packages rather than DMGs." + - hash: 724c45a5de1c73f48830d7ea8e395d74b5a12152 + author: Juan Cruz Viotti + footers: + see: https://github.com/probonopd/AppImageKit/commit/1569d6f8540aa6c2c618dbdb5d6fcbf0003952b7 + signed-off-by: Juan Cruz Viotti + closes: https://github.com/resin-io/etcher/issues/1032 + changelog-entry: Set dialog default directory to the place where the AppImage + was run from in GNU/Linux. + change-type: patch, + fixes: https://github.com/resin-io/etcher/issues/296 + subject: Improve UX when re-selecting a single available drive + body: |- + Currently, if you have only one connected drive, Etcher will auto-select + it. One the single drive is auto-selected, if you attempt to change your + drive selection by clicking on the "Change" link button, the + re-selection is undone, and redone in a matter of milliseconds, making + it very difficult to get the drive selector modal to open. + A simple solution to this problem is making "Change" links trigger the + reselection action (e.g: opening modals, dialogs, etc) instead of simply + undoing the selection. + - hash: 63e8a86bdc56ed82489b2aba176b50c02f051808 + author: Juan Cruz Viotti + footers: + change-type: patch + changelog-entry: Fix "rawr i'm a dinosaur" bzip2 error. + fixes: https://github.com/resin-io/etcher/issues/310 + signed-off-by: Juan Cruz Viotti + see: https://github.com/resin-io/etcher/issues/355 + subject: Add a Mixpanel event when the application starts + body: null + - hash: 027fe24f3a5ae704202ace2d8b3a697e4a0cea69 + author: Juan Cruz Viotti + subject: Add "Change" button links below each step + body: null + footers: + see: https://github.com/resin-io/etcher/issues/898 + signed-off-by: Juan Cruz Viotti + change-type: minor + changelog-entry: Allow the user to disable auto-update notifications with an + environment variable. + fixes: https://github.com/resin-io/etcher/issues/290 + - hash: 53248dbcd3b480928e78007a178cb21219707117 + author: Juan Cruz Viotti + subject: Connect DriveSelector with SelectionStateModel + body: |- + Previously, `DriveSelector` kept a temporary selection state until the + modal was closed, which caused the selected drives to be passed to + `SelectionStateModel`. + This proves to be problematic when attempting to pass changes to + `SelectionStateModel` to `DriveSelector`. For example, consider the case + where the `DriveSelector` modal is opened with two drives, and one is + ejected. The remaining drive will be auto-selected by Etcher in the + background, but `DriveSelector` will not update itself with such change. + footers: + change-type: patch + changelog-entry: Fix `ENOENT` error when selecting certain images with multiple + extensions on GNU/Linux. + signed-off-by: Juan Cruz Viotti + see: https://github.com/electron/electron/issues/6305 + fixes: https://github.com/resin-io/etcher/issues/304 + - hash: ca2159bc2ff32a39c95a064a81b83a3884bd0dbb + author: Juan Cruz Viotti + subject: Hide drive selector modal if no available drives + body: |- + If you have the drive selector modal opened, but you eject all the + available drives, the modal will be closed automatically. + footers: + signed-off-by: Juan Cruz Viotti + change-type: patch + changelog-entry: Fix flashing not starting when an image name contains a space. + fixes: https://github.com/resin-io/etcher/issues/295 + - hash: 06a69a26ff247690814fed92a692cfbb96d19549 + author: Juan Cruz Viotti + subject: Add Etcher logo to application footer + body: null + footers: + signed-off-by: Juan Cruz Viotti + change-type: patch + changelog-entry: Fix error when cancelling an elevation request. + fixes: https://github.com/resin-io/etcher/issues/252 + - hash: 7c280189587ba69c1549839569b440b390d79c10 + author: Juan Cruz Viotti + subject: Highlight features in README file + body: null + footers: + change-type: patch + changelog-entry: Fix error when writing images containing parenthesis in + GNU/Linux and OS X. + fixes: https://github.com/resin-io/etcher/issues/291 + signed-off-by: Juan Cruz Viotti + see: https://github.com/resin-io/etcher/commit/951b8de9fc76821cf3140bd7e75c2d57ee8def21 + - hash: 7c6b0dd48cdd6d3b642c70144baf310eb7a483c5 + author: Juan Cruz Viotti + subject: Replace all occurrences of "burn" with "flash" + body: Technically, a removable drive is flashed, not burned. + footers: + signed-off-by: Juan Cruz Viotti + fixes: https://github.com/resin-io/etcher/issues/297 + - hash: 096a7e9c545fc61f255eaeee1f235b2d5cd54e53 + author: Juan Cruz Viotti + subject: Allow to drag and drop an image to the first step + body: See + https://github.com/electron/electron/blob/master/docs/api/file-object.md + footers: + see: https://github.com/resin-io/etcher/issues/820 + signed-off-by: Juan Cruz Viotti + changelog-entry: Add support for `hddimg` images. + change-type: minor + fixes: https://github.com/resin-io/etcher/issues/279 + link: https://github.com/resin-io-modules/etcher-image-stream/blob/master/CHANGELOG.md#v230---2016-07-01 + - hash: 6b7323ccb09d205a5cf976a8eac8e1700bd5c182 + author: Juan Cruz Viotti + footers: + fixes: https://github.com/resin-io/etcher/issues/281 + see: https://github.com/nodejs/node-gyp/issues/1151 + signed-off-by: Juan Cruz Viotti + change-type: patch + subject: Compress Linux executables and Windows DLLs with UPX + body: |- + Before: + 118M Etcher-linux-x64 + 122M Etcher-linux-x86 + 142M Etcher-win32-x64 + 116M Etcher-win32-x86 + After: + 74M Etcher-linux-x64 + 74M Etcher-linux-x86 + 124M Etcher-win32-x64 + 102M Etcher-win32-x86 + - hash: c3793c1a9e01a17be1de3abab35a1cc72ba3b6a6 + author: Juan Cruz Viotti + subject: Move package ignore list computation to a separate script + body: null + footers: + change-type: patch + changelog-entry: Wrap drive names and descriptions in drivelist. + signed-off-by: Juan Cruz Viotti + see: https://github.com/resin-io/etcher/pull/548 + - hash: 320a3d116f5d2b01c7d88ff75f457d829ffccbf9 + author: Juan Cruz Viotti + footers: + signed-off-by: Juan Cruz Viotti + see: http://electron.atom.io/docs/api/web-contents/ + change-type: patch + fixes: https://github.com/resin-io/etcher/issues/280 + subject: Implement OS notifications on burn completion + body: |- + Its helpful to have an auditive/visual cue when a burn operation + completed. + Instead of adding a setting entry to enable/disable notifications, you + can use the standard way to control notifications from your operating + system. For example, in OS X, you might go to "System Preferences" -> + "Notifications" and disable notifications for "Etcher". + - hash: 35aeea1a60bedd7c0f7c2b013243f337876e1711 + author: Juan Cruz Viotti + footers: + see: https://github.com/jorangreef/sudo-prompt/commit/17f45ebef31afd9fb6260f7c2950fea4aab5ae4d + signed-off-by: Juan Cruz Viotti + closes: https://github.com/resin-io/etcher/issues/874 + change-type: patch + changelog-entry: Allow the user to press ESC to cancel a modal dialog. + fixes: https://github.com/resin-io/etcher/issues/278 + subject: Rename Linux binary to "etcher" + body: The capital letter is not very user friendly for command line people. + - hash: 8d48b82928e646940a87b0fc5a2085a03948db6c + author: Juan Cruz Viotti + subject: Upgrade Electron to v0.36.11 + body: |- + This version contains a fix for `resizable: false` not working on + GNU/Linux. + footers: + signed-off-by: Juan Cruz Viotti + changelog-entry: Fix state validation error when speed equals zero. + change-type: patch + see: https://github.com/electron/electron/releases/tag/v0.36.11 + fixes: https://github.com/resin-io/etcher/issues/272 + - hash: 292a9bb642a37f6c137511de095486d121844d51 + author: Juan Cruz Viotti + footers: + fixes: https://github.com/resin-io/etcher/issues/1180 + see: https://github.com/sindresorhus/is-admin/pull/4 + signed-off-by: Juan Cruz Viotti + changelog-entry: Fix incorrect ETA numbers in certain timezones. + change-type: patch + subject: Prevent dialog.showErrorBox() throwing if wrong parameters + body: |- + If the function lacks a message or a title, the following error is + thrown: + Error: Could not call remote function ``. + Check that the function signature is correct. + Underlying error: Error processing argument at index 0, + conversion failure from undefined + - hash: ac3dc07a2679124330b0781ad8ce2599529e56ff + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io-modules/etcher-latest-version + fixes: https://github.com/resin-io/etcher/issues/255 + signed-off-by: Juan Cruz Viotti + subject: Upgrade drivelist to v2.0.13 + body: |- + This version contains the following changes: + - Detect Macbook SDCard readers in OS X. + - Detect removable drives better in Windows. + - Keep one decimal in Windows drive size. + - hash: 8644bd45fa02ceb2f64f48c13e678d472d04e651 + author: Juan Cruz Viotti + footers: + changelog-type: patch + signed-off-by: Juan Cruz Viotti + subject: Make clear that Etcher supports OS X >= 10.9 + body: >- + Electron no longer supports 10.8. + + See + http://electron.atom.io/docs/v0.37.5/tutorial/supported-platforms/#os-x + - hash: 097c9a4aa37029154c3efe8564edbeef048926ad + author: Juan Cruz Viotti + subject: Add subtle hover styling to footer links + body: null + footers: + signed-off-by: Juan Cruz Viotti + fixes: https://github.com/resin-io/etcher/issues/253 + - hash: f9a80f6810afa2f74e96e487f389883bfe839326 + author: Juan Cruz Viotti + footers: + changelog-entry: Show friendly drive name instead of device name. + closes: https://github.com/resin-io/etcher/issues/1170 + signed-off-by: Juan Cruz Viotti + fixes: https://github.com/resin-io/etcher/issues/254 + subject: Detect removal of selected drive + body: |- + Suppose you plug a device, select it in Etcher, but then eject it from + your computer. Etcher will keep the selection thinking the drive is + still there. + With this PR, the selected drive, if any, is ensured its still inside + the array of available drives, otherwise the selected is cleared. + - hash: fd290b3a0026193d5486cdca5e0b93d82063adc6 + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io/etcher/issues/325 + signed-off-by: Juan Cruz Viotti + fixes: https://github.com/resin-io/etcher/issues/257 + subject: Fix window contents pushed below when a modal is open + body: |- + UI Bootstrap adds the `.modal-open` class to the `` + element and sets its right padding to the width of the + window, causing the window content to overflow and get + pushed to the bottom. + The `!important` flag is needed since UI Bootstrap inlines + the styles programatically to the element. + - hash: 64393ef073131a26a9cf3647aff4cb3a50287ac5 + author: Juan Cruz Viotti + footers: + see: https://github.com/resin-io/etcher/pull/1168 + signed-off-by: Juan Cruz Viotti + subject: Watch sass files in modules/ + body: null + - hash: ee445e5d04f19c0391cb936c388c909c93d416dd + author: Juan Cruz Viotti + footers: + fixes: http://github.com/resin-io/etcher/issues/357 + signed-off-by: Juan Cruz Viotti + subject: Display image CRC32 checksum on success + body: null + - hash: a4458fdd8718af2a9ee89bc5a2e5e326f91d6bbd + author: Alexandros Marinos + subject: make inbound links from the etcher app traceable in resin's analytics + body: null + - hash: 8c05724796bcac26e24134515a6b85d169fe9873 + - hash: 76c42b1a78c399ada93873a08d8d8ebcb0c8984d + - hash: f250a9c3f7b255de255d6a79a7417ed68ba15b12 + - hash: 909c5e7fd5d9ea29f90ce9383da99ac8892076a1 + - hash: ff25b01c38e3b36af78ca84d3d962eee818ee197 + - hash: 860d2a7bc6c251f6579dff66c23c4f6415adfb90 + - hash: 7da8438d7dae68986258d1a5e66325fa16746664 + - hash: c30eb8f43582c45a5d299f38202b05af9a432be0 + - hash: 989303b2d3c223dbed713938126c311ff4735d9d + - hash: 97e9c5f22b07490bde4735197a83032193de81d5 + - hash: d0f1cd03642cfdee021477cde3297d10b1615b11 + - hash: c409512268938c9b4a388155ab1b779498c59adb + - hash: fd9b227ae040de3f5a49263baddd5aaef5000770 + - hash: 92084980a96c44d0e091305afa5ea3191afd858b + - hash: 35355ecad923d0ffab5e48efed74ae51cf9b3ad8 + - hash: 7694baf95608cb506419c67f051b5659b3209709 + - hash: 08e98c7d025449453ce924ba543926985f0fb27c + - hash: 8f3b78cb87ceab0429b035ccf0ed81a7745d8808 + - hash: ec02d2e9606f8bf250e4a1924c5e8fef01f6e056 + - hash: 5875afea1a5448d1ff39d5590c494f5074fb5b37 + - hash: 37cd2f1efe5fa147741829b572714141e04f6a68 + - hash: 9532584bff1a82133cbe09d39d8ade6b09e5278f + - hash: 5fc075750001a826cf46370f605160d8055b8dbd + - hash: 5b8edbd3f3d1927b077c46b7ee3557dadffe3376 + - hash: c8dc96946d21647b9a5d431164a0c2df97def272 + - hash: 50c306d4634b701819254fdaca6d56e74fbee023 + - hash: 4a84b3fc61567bb1fbc2ec7429fb353ce06c38f9 + - hash: b83009e72753a71e93983aceaaa966157e9389d7 + - hash: 9898bfb4f4a4de29363b7c4b465dd854341a4bd8 + - hash: 15a848f1bae06ac75125d0ba6fef13bc8dbd14a5 + - hash: 4261e702f245ef1dfb0b70939293b49ccaebcd15 + - hash: 8700c4c49a746190b5dc9016222e6f3fda04c234 + - hash: e14563ebdfd0ecb4f480d728ff2724421924a13e + - hash: 77f53a6bfdd02cc6ca6da05bcd130383c4af1d28 + - hash: d5e3d487894e8892b70acf27eadf313e47063196 + - hash: 4d15f393ca86638ac7d8c4485808345af27ebde1 + - hash: a58b756513f8b6e8aea5f60197e95ee3d0789c5c + - hash: 497f3620c9147ee4f47b1540e92e6d2e2a7fea39 + - hash: 957324736d65aa674adf4c95d8d183b0574e1c28 + - hash: c4185799ffcb6f1d36eab397e4dd7365d605d81d + - hash: 76b3511de959d32e19a94a98d44efd4cc905f2c0 + - hash: 38af307610139b668599de42cdd8955c702be4a8 + - hash: 4fc2185b45bd71f39866a0640ac7b3b2f3022403 + - hash: 7c2c169ec6a8712a15de1aa1221ef635ee8eeb20 + - hash: 5ee2d5661f560bf1645c833eb185108b39919701 + - hash: 3862ab918c02a1266d4291696c10b657244f187b + - hash: cdf66453991f6ec51cffe74e6d2296e3adcb97b3 + - hash: c4053c1e538435a1b9a46c343fbee3e880106843 + - hash: a0f1b051f60bbcfa774649a021b5c7a84c1a6232 + - hash: 70e740cb08d8fed83cea7257829aa36374fa4cb5 + - hash: d555c3dc19a9bffa42973213eb47c7863f00e08d + - hash: ad7975bb915bae333576022c8352e776de8f70a7 + - hash: a5222646003217d1c50efb8141e2072cca720198 + - hash: 5dfee99389862460c00de07b4fbc55bf14e146de + - hash: 5c20791ef2039ca60ddcb4cd7d219a6268cf95b8 + - hash: e6527de9745fa095216c207b20af511196918562 + - hash: 0cc729b3ca0ff70fa9694a30f6904bffe7ecbb60 + - hash: 695b40d2b2e491e0b98047e80877b711b5b2216e + - hash: 3b46d7f4aa78476325d0210a674c9260ca74f520 + - hash: c84a218ce6b54993b58ddf90e076af47a7637b9b + - hash: a6eea5c690241b8a222fc989b4b08f9f5ec33192 + - hash: ec8a47994ec4c64889f30502b8723faace48c11f + - hash: a6e80ab79a6a60845e7d93373dd7541732cc7c1d + - hash: 54f36b7a3d0578e1dc3aacabcc8f7ffba8f51130 + - hash: 2cfcf5b014038506a3c739e6fdc82ad2cc12c59a + - hash: 6de624ee72124ad70dc4d9870842fbace07fbd29 + - hash: e3a4bd2e2f459107e82f3656a3c6e6e6675fd2f4 + - hash: 701d38fb38eb0c111376fd46149bbfd27b15bb07 + - hash: 1026b1506bcd7c26d07974d04dd11d39dbba853b + - hash: 8527eb6eecec2c6723e33233d9272f4d4c79d690 + - hash: ff0f9ee583d64806a04d2fa4e981c0f9d3588362 + - hash: f974bf57828b4127225d69615de62a93845038aa + - hash: 7dd71e35238812ccee19c75baeb68cdcdb4f9d28 + - hash: 6c82ebe0c8437afe148bb27be22d6dc9949abea8 + - hash: 46de24ff0c914b144b54129eca94285a39ac9580 + - hash: 0c9417c6b31108df4f4170ffa907e03c2829e3be + - hash: 29de0cda9a090a049ed05eff36b8bd9c85ede2da + - hash: 50c706dcbe69cdaf2457cd27c9c4e42bc2c84c0c + - hash: 33d5a544382b89002b0b454941ffead6c247fddc + - hash: cc215c6307afe2f3441f764379a15eeaa8634303 + - hash: 659ce3863e14a65c9730a21392f87922a2a2ecb1 + - hash: 7b36a96525dc6892d645c6b6e0108aa4623c1f3b + - hash: 41c993bba5de5d5122559c5958a397a71c28364f + - hash: e4a1f6314c1b6ce41d81029849a1889e8ac87393 + - hash: b9a211365a24adcd34ef414eaf39e43c6bd1c8b9 + - hash: 4d5f99bf351f79a33aadebf43625ea523f4b16d1 + - hash: c78b25daac6057985d647b10bde46144c52901ed + - hash: e5497367eb5899684e4d920dc8d19d876d92350a + - hash: 0e692e208dc6a4154436f2c6cf8c1cf1c629b1a4 + - hash: 96b4c97ca7f7b877f1e8948f70aab864c03804ab + - hash: 03d54fabd69e050bdf699087cf351ab9440f3f93 + - hash: 163f69faba4902d4c8a0bd4edb216b895027fb1f + - hash: 4d0a3c8f3ccfdedbf2acc4e2da5c6455bdf92fa5 + - hash: f0a81206f02a71d63fe3bb968ec376330c8cd3e2 + - hash: 093762427923b8d198ed9b797dfa0182b370ad3a + - hash: df13fa6499dc282fa5efd007f3a0851a387a7baf + - hash: 3604fab4c58108d730a3201de88675fca465093a + - hash: c391f660f61c1ee2ca42ef6826e5940f810f25cc + - hash: 66030b43a83eac1c260b9a79dad1454e7abf091d + - hash: 205b8ed21ae9504f991f4ab0fa2dad3babe240b6 + - hash: d5e8f5617c11cf8bf8be2a80227733474dfa85d3 + - hash: 7670b9e7d6f2cb743dfa25b74e01f899fcdd70d8 + - hash: a1484bb1a6b7be386c58c20bd81578b3437138d5 + - hash: 96c5ee67d6f0b1df43e6ddb7d5466f660f2e981e + - hash: 720aaa55f69883ad0a343ac113a1a36db0cd8b0f + - hash: c2d74f5ac18785d693fcaf4a38e5ebffa0800faf + - hash: 2450f216b660125547454a8e0aa371417c3c760f + - hash: 49d454668072f1b3482fec021bba3012168a06de + - hash: 5249533c5c52dd2020836b13b4b64cd57c08cc57 + - hash: d4b245562c6420d957d5f7823909c3c44aa98543 + - hash: 06215ad6e1d1a4b7f71fdcc7d61306389248b5e3 + - hash: 84368b3d00b3315543ecdda0212158437de75a98 + - hash: 95ee174f84efdaad366a5074699cfd0c98172bd1 + - hash: 95fc169699427c9a0b83c934ffea109ffd75068d + - hash: 809e91664bd669bbd4c441b60f6c17a30cd65463 + - hash: f0d091cf90ab5756afade1822d1e933b78a8479f + - hash: 26802ccdee5933a74789e60ae1ee68e17692b6d9 + - hash: 42d4386ab698d4fdfb71fc7398ce55e564dd09df + - hash: 8818183e4ee1af05f7612bccfdbcbfa720f0c17d + - hash: 8fb45c5fc83a60fd654985bdf3e68719d58877c9 + - hash: ad739c66d764c11f5cfacdbc547e8d9974b1623d + - hash: bd9c7e2e73dfa0ed5120bcfb92f342b37ca9f493 + - hash: 93a32cd13165953e142f2520e1b8744301cfc659 + - hash: ad79dbf50ffd019b4f86eee6c62cbf6c52c90210 + - hash: c3ab93288d2e0b2cf2afa63f0bc016843c0c77a5 + - hash: ad697055e0bc82ae4f3c7858dfd4a182517ac28b + - hash: 87252f7373cbd2a54a17f1acb620183f81fad8e1 + - hash: 418d9574213a04c438c588b7294f0744bdb397fa + - hash: 55ec44519db65e7496a3896a3b2dcf75d30e5c1a + - hash: 3fbfcdb953b86a6a76413da18997ce83380a485a + - hash: 2747ea430f65a867e868f9b80691690fbdbb8131 + - hash: 7ac5543d03080d82edca501f11ccd0097c1711d0 + - hash: ddc5b009be623c439e460b85096c8d224c1f5738 + - hash: 63f2abb4bf55fa3aba0622879e0b6db9bd41cd4e + - hash: d8550f6d5d96dfed853d82d42ccdc91b75a51a52 + - hash: e1c8f60229497bd988beb64f02440b15ea82b503 + - hash: 0e83e51de5f3e1d6c6262074da6dd2e6c67c2f7c + - hash: 3dff8cdfb154cb809a86116f46e4c1cee54c0074 + - hash: e7c191484a1ead0f4408f63fb7e99516261d4f39 + - hash: a16c9eeccf47df02707157c3e13b4218eb30d41c + - hash: 04137e7b8c1ecf73b046493f3ecbc414a37f7b4f + - hash: 64cc585d027aa1c60e2aaa44aa5d8ff689093ca9 + - hash: 1c33483cd205d4cf162d693c8b30abe4371602d0 + - hash: b6b252a79c9ed562e288955dbc1feafe2100914a + - hash: ee2072c75a8306b0581e0505884fb7b42e4c364c + - hash: b6cef2a99632af9350f596d8e8ff001600062e5f + - hash: fc4fa98f93e9f1aca78d68659c87edfdfe8c8161 + - hash: 38dc5d232b1f72b4d6f93ed341e2c42fc6e82119 + - hash: 3bfbf6c122ab25ef88b50b9d5f6d54b6e18256e5 + - hash: a076e0264debf5ff6360820cb117d27222f6fdf4 + - hash: dffcf5e7df5bbe3096d57866a80cd1931aec9aec + - hash: 1022b5dbaccf97fc0b8d8c03a5a815a3c9214bf0 + - hash: 3d9a2a972bd5872de3d44800c96cde7860e585d3 + - hash: 8c3a2af5b60d89e5fbf28cabbd47160641855451 + - hash: 085aeca2c2e8e1f60eab3364b952c1d54faab3ac + - hash: d7fcd57d6504bfe0d7160af0718d66944f3a7dbf + - hash: 4cb78bc2624a380bcd411ca8ac0ec860d3e388ad + - hash: be5e2d9bba6da25cf6e7e96ce18af5f27621e023 + - hash: e6eaa797a318020a0e2d767efba97ccbaae904c4 + - hash: b5ba4ec202b9ab4fba9ccbb3e25e89ea62e54396 + - hash: fac0abad5d1fa0ec3ecef44621ef82f870e9693d + - hash: ed6d1f87e07da2c5064ea16447eb20da4d421e8a + - hash: 1a7b9a18ff578371812eddb77f2e5764709a2b7d + - hash: 32ced56abcf520446e65eb16f50b65355b5f9ffe + - hash: e0183a7fe9266ea8b56b06ad4ed4fe32f605c159 + - hash: cff916a27ef70ba7ad64a94bc533bdf999f508b9 + - hash: 99cecf8bf504990e977e5344772cbc8c2e58c191 + - hash: 492e7714df10d443dbdebd447ff49af6131e69e4 + - hash: 17c71db80223ed2f657744ad899732163e9adf28 + - hash: c71ace85ea048063ca3574096b51e23f0e229550 + - hash: 94a134516740e2ef165ea07cad92ecc76760c646 + - hash: 5a883addb45c97079b3b29fe395293c35d08aa6b + - hash: 9e2fa1db20ec79f9ff4f978b3e38ba4caef2d146 + - hash: 3449980f78e855e17dc1e9ca31d8d93753b797c9 + - hash: 4a345d5583372ccaf662a0d78184c0d17402ec95 + - hash: ec15081c7169c4e846cc903a8142f945bcfcdf56 + - hash: e79611712defd827df31b1b604a7cd505e2af966 + - hash: b3a2ba81668bb7146594b5c1e711780a7210ee8f + - hash: ebdc4287a8eaf7533efbd28a8b849ea7684db5f4 + - hash: 5c388e74184ec44ab8fde6a50e08415bdcec1ce9 + - hash: 5a625914b5eed85e9d4ab8073e4eea4b4aced914 + - hash: 22863298fb77f69a7727b17dc768739a1168b710 + - hash: f2d2254a5b208efbcf3c7e21210dee80b69e0d86 + - hash: 7759e88d959828fa2e16c722a0a1bbf670fe109a + - hash: 9b43142e792e834e4d1574e7d0fe5e304cbdf869 + - hash: 843cfaba85ae9d3ba63e6de96bea5273d1712b95 + - hash: 4404f8bac26a345520cea296920c55e77a4c95f6 + - hash: beb5fed59c03b8ccbcd264b63d360b0c62a81f59 + - hash: 44e641108a29eb2d30570376e890ca4f3f7596cb + - hash: 1fc6fc0939d64db83567e1bf6073de7a9cf2813e + - hash: c97a4e3c86f1a6bd6ca7f9acafa6eba4357514b5 + - hash: 3fc75c885b6026af13586cee2fe552ea7216fa9c + - hash: 388c6d0d94fdd258838ab8babbb8f7abd9c9bce0 + - hash: 7139a516c9633d1f68929070676c5e788f550ead + - hash: 032d66aaab69c8259e340082fc1b9eb27e19a79d + - hash: 204216f575d995fda05e1a0ba9ea7af033a75bee + - hash: 1e757096efc7f93368705e4aa96e7c07e786bd50 + - hash: d0fbda582a7970d5d3cc55cf0bb79831b5aac693 + - hash: 021ec42ce08b23227abcf8037fe38521029c85f0 + - hash: 02ccaeca4b8aca43c57745e2acb5e406a32b61ca + - hash: 85903d5776f3762f0dbbce22ffd3504f37726d2e + - hash: 83f243b32c7b9fcb9a699bc9cefd6c5a744d9673 + - hash: a9547ad5715d83b27410eca270e443efceb3255f + - hash: e1b13580d55f64022750d76a08ffda3015554bf2 + - hash: 7af77fa08851d8f3c69c2ee04e804a5eafb3ffa3 + - hash: bd23cf7f0514d798f1407877636015605130b79e + - hash: 3aeeeb069a09e49a62d0526a76bbf5839435dbf6 + - hash: 234f9905656e330b4460d40b17f6388ff6778da4 + - hash: 43991938e6dd3a5d113337739d2d9456535208f3 + - hash: fbd06c832f9c2db32f040a132b4f42ba95f07027 + - hash: 2636d3bda692446d8b9c5a218b5476be18cbd371 + - hash: 821780de9aebd2e2944377ca81e649b7a621f1bd + - hash: 0d1ffc6621a8c8c51d1ca2e77484916ffff6c9b2 + - hash: acb312f2027c52ccfa6e11855eb03f577ffbc717 + - hash: beb369c09d6265625c59207d78ea72d5e1b2459d + - hash: be48b96def73a3cfa6aa62f197de18dab2470be5 + - hash: 85befa43e1e10da992676f3c8d77d4a1a2506382 + - hash: e2c35fa2312884dd3bbe18772e760623d604a01b + - hash: 9313e3c293c9fa6205e6d04d121efd961299883d + - hash: 951b38e1819b109a57c1ac02711f9bb0a415785a + - hash: 9f76160bc4258b563d5c26aa90222aefe73ebda5 + - hash: dbdcff19ae43433164f1225a5a619645df96d12e + - hash: e80f5a128990319b89db55febc5c86b38b7519fa + - hash: 5668704b812f4da0014a2733a96b9deade32c5df + - hash: 3d7101680aa4cb2de17fd85d7f90fd2f670b6159 + - hash: c8c47576747a3ef354cccd92a6d831a387d2e404 + - hash: 502c03c5cda34eb4f3f997030139cf97b78f6061 + - hash: 8bacfbc99dc254d3beedccd941cf2c78d1bbe4e8 + - hash: 52ffe29e1ef530659431fe6593e0698c5e3a94b1 + - hash: 3a2614397cd1ac2d3a1f5d997f8e18df76174545 + - hash: eff0cbed7447afed17086cebdadeaed1def0c492 + - hash: 9074216b59ab3da7ddc8e7e4864429ee80fc21cc + - hash: 4329af46c64d659ceb4827ceda4a93e52053f3a5 + - hash: 2f8f9a66af9e7609ee2be3faaa0e68d98a9e93d3 + - hash: 7a2578b704e69b30cf761dafaeff17460e161fbc + - hash: b9be09ee70a7e7212df3e01870e1a5696170cacb + - hash: ac10160fe96beb1140a166a45971e4fec59deb81 + - hash: 162774127ce1dafcf39827927467627e86cae943 + - hash: b0a0c620e14fd01bbc21017599d90d10815a35bd + - hash: e4c117921f3871989e7eb852ae7b058e7da9a15e + - hash: fba6a1b674e67599a7927b838e53b63126b2cded + - hash: 1651982ed268404cdae62cfc49c4278b1a3b6a47 + - hash: 89c95e61ab4d1d0ac5ee30080a2627c3a5c54d72 + - hash: 0a5b5fd1cc1bc599b5a244460dde852ad2679a6b + - hash: 8612b559671a503839024750189170f63d9ac282 + - hash: 681a73b6a76f23e162341795b5f30bb89edc92e1 + - hash: 014b4201c3df8e81751a6bf7ed9bdada61924520 + - hash: 77000979a9caed190ff722292085dfd6792c5d25 + - hash: 6e93aea54c877fb4f1afd8a8931201856b75358f + - hash: 490637f99bdb61fd73406134ea35e1ef61feac4e + - hash: 37e863870e49584aaa450614db424c06097a902c + - hash: d14e9ed7f8fee826762bc2fea79f0a5db698d5d9 + - hash: de32cd108f7bfdba0e47aaa2a22e92524cd6cb22 + - hash: e10afd745dd4ffca5219eb38f889bdb10955532a + - hash: 4c77f82d8277b19b5eb53fe19e7728885a5ebde1 + - hash: 88cb4829be78df7689ee52233bc2a151d49a3036 + - hash: 2612ad25852ffc4a97432ab53891b066e4be2d28 + - hash: 8530d70c27e8618f27d94231851b78da7087ff41 + - hash: 2a38d57b56188e567e5c049acf1283cf3874a3b9 + - hash: a45a37c744181a2133427cdc8297d23774caa954 + - hash: c13a0f3df3825a714954c1bab8706586c555c7e4 + - hash: ca0a6ccb053129fe4f35b34adfb85f84c9f6f9d2 + - hash: f0d7baa68ee6dc956e6f668831bfe6785caa196f + - hash: bbd285863b96fd33d9a21deb44851c5bf6475591 + - hash: 5f60de9cb319e0e80e6f4e9efe057a9faf50884a + - hash: 07517dae496aeb9175fe7149daa8cc03cdb54e85 + - hash: 501be12cc1b2de6937792054e9dca838882f01e4 + - hash: 881ca9550791fdfbd93e29914e8a43388c144967 + - hash: ffaa6527b20e5b1812be07c393e6b7d124675828 + - hash: 38ca6001b9b07a18bc5dc7cb311c8aecbe1abe30 + - hash: 62ce1f503f41675f91fd25ed20e916310d867e3c + - hash: 7afdeeb25a4f89ce3374e54640caf671bd36a2e0 + - hash: 9f99e463e55c611eb505c11be7c5bb1ea6adafa6 + - hash: 57d60143276a622b3c91d62d0a29bc22ee01bd48 + - hash: 83144d2393bbd432006d546c85428e80d9395d80 + - hash: bde99d0b96040fbeba46f4432dde8edfb31e6932 + - hash: 4e75156e674ae23ff364e4709521851563e73066 + - hash: 27fc95a375abe2b06acf4595005395609551dbe3 + - hash: 513ca03d165ca6b88642792f14f4bc1dbd6ea1ed + - hash: e9c12f5336e24c40617b3d2a820876646fdc2c0b + - hash: f01547cf6db75d749d491215e8e95b10c21bf6ae + - hash: 446b9c4d8a3013f3aa3308052417f74b7c069cb5 + - hash: a32f105ebb278e4faa6444f42cf4e4a9b7264eea + - hash: e2882c8117d0f5242b6550ffc4f732b8162bce5e + - hash: 9a364658e63233f012a0187e3b1e2db9a2f18d48 + - hash: b7841f23eff85fcd69afdab95c4f15ed10a96236 + - hash: ab30e1a8a71f4c9f6dbd1dcb6dccb97b1eb545e3 + - hash: 99c4e816cf6d999568ff48e9fa8498bb1263051a + - hash: e991c39d4bd49b9e3944a0da27375b8e9bdeb02a + - hash: 3b8a44b0c8d338bbb72b63aa0fe884db1cd73f75 + - hash: 9b3977fb24e43d12262b1e68437b2a4b2d608b8b + - hash: 6c9e8ab692139b76f5bf5c8443b033b45e676b86 + - hash: 433eda5413d977b0ace04421e0036f2c8b547a2d + - hash: 6896a0af7d36810775d198a4f88e6bec417d975f + - hash: af9b8d6cc5054b09b1b748b7bed08da48855e90b + - hash: 03ffac9424680ec631eb474662446704a8463659 + - hash: 02dce4b79508dbb17a0a1ffd2ed6b843d35c1d82 + - hash: a1e08ccab1440cc4031a72d3a3333b6da4e8c62a + - hash: 553eb009592d2a576f1b3b24242d4a1e0051bd5f + - hash: 7625278b054fba5b779f2aea0e9d67bf050b1151 + - hash: e9c2712c02898fccc6f977e28ea1dda47eb0f967 + - hash: e1cdbdfce13b0ab849a407363cabbefc4043e2a9 + - hash: 15593a0169d3731c1c2b7fc3be0f3379672f933e + - hash: a53880888cf56e96c8c61c05751bd9a94f9abaf9 + - hash: 1d9a43d1c46f8c6714bedafa9ff2800b13d201e2 + - hash: 503196da941ba0a672a6267b8e1fba9dd922ba5b + - hash: c1ddc4635e96ac7b6ecaaf465897004114b51db5 + - hash: 66f5a01ee078e0878126399b7ec607ca20b4ec96 + - hash: 5782e19d7a7d7f762d7f3b14697173ce820db027 + - hash: 39054097001ebf902eab13eb2a8dfd1cb9318ff4 + - hash: 63bc130b1d6daf2bcba6c4449b3ec65d386eab0b + - hash: 16794b4c64132069e62e2e480587a592e70de20c + - hash: c5168b2197b635dec1c29e97967087f22fc1155f + - hash: d3a1a7f6f5ade5757a316b3d6f2c2b0dcf9eab3e + - hash: bcdc71fd04570154b32467869cf96ed2fdb31aa2 + - hash: 341b936dc2509cd9a402d900c4e53388fd8ef767 + - hash: 87ef056be8a2b943c93425f6fe4da62aabb30ae9 + - hash: 4acc7989b62ff5fc7da0d9f2d117d434b214ef01 + - hash: a9c37583c783c529e1fb3af8e320c3295215be95 + - hash: 36536eed41c2613aa5ee6e2859c7c6fbccb19ee2 + - hash: a8593643fcd94e0c1b5f25fb0a1e227d97a5aab4 + - hash: 18536702575e99d1ffb916ae698a92733e6593d1 + - hash: 0fa9a221d3800c864dc26e0489e4e54efe4d7ba2 + - hash: 5d57ba25905f53405370a5330c76db28a207f1cf + - hash: 16df8e47df98c110ff3c6e09d88c5bd175122afe + - hash: 481e9527ecfec745e14b59158d14bf39eeef56e7 + - hash: dda62cea16b35c50c5a9c52523406b7e2286a6de + - hash: 2fa814e39041a704aea3998cddf933e1416837d9 + - hash: b8a6108d860faa9f25e796562f2d442367ec53db + - hash: 6b63068ff07005b55dd2bc87decef62262c071b6 + - hash: 5004dd16761b96917c483fcb34c24825ec2b44d6 + - hash: 53f5a99f47b66c2eaade200a4ffb96ecfe66e0b2 + - hash: 640586f30a8dca5748192619312225052394df8d + - hash: b1355e6539fe37f7fdd905ca25c00a1429cb1241 + - hash: 2e6530693e4be67afa5c86c7783352efd4038de4 + - hash: 99fc39718a5f4435a4407c20718480a726e04a2a + - hash: 57a81f9c5330d81876390e9b388f35d7d5a79c8f + - hash: f67123f13e9573afe3c0cedb13051a7131db9dab + - hash: 13e4e41d19292fffdb0e4125615126891a760527 + - hash: 2564aa6dc96c49badbfa42b4197d6180539a0765 + - hash: 2bdb243bf5c8982df5bf415ab9828b12863f5784 + - hash: 0812dc8fcd0389ea3e82ef369a60d8e6663395bd + - hash: 20b3aed89b07003a39a574cf42dd29be907a5173 + - hash: 0c23d9c824a2056d39e32975ff5aaa90606ea7c1 + - hash: 29879674796e1825d447e43c61a8ad98105a3e1b + - hash: 2e0e65ecb27316501844e03e651f85d597794cfb + - hash: 54c0559f58950cc3b26a1e317f36d743fb662662 + - hash: 682708508c7bd47a16480a76e49e6c7fdd3f918d + - hash: 9980c3e80932fbb5fa6c6c1cb6fef005aa86fd88 + - hash: 3c485efd56d74860ea651d96492a5e8cb47cf9c2 + - hash: 6ea8d92636392ebb10d8ecd0ba6e78ea81e33975 + - hash: f3879f474fc93c2513c7b842e885e5c79418f7c6 + - hash: ef0a5b1d3671b572447d3ad572c9ea02217f9cb3 + - hash: cd9a23e300d6fcc28591a48f6f86bc3f7f53bdab + - hash: eff832d60ecb21c6d57e5009a8a06f05db53d18b + - hash: 8c75ff0c1983d8fdd026900f3d32e01aab799cee + - hash: f5c0d6915d94239adb4ee816e7a2793d14eb3061 + - hash: ee2d368f526572e0d0948e68815b8d8945bc5e92 + - hash: 6e44b8b3c3b4260ac431f61b13e879b5c0123a03 + - hash: e09a9e569dd44e9a7c6a5d2a8523d67c945ccb5c + - hash: 9b0bb6abfaabced54732f340710750f65c1a172b + - hash: e7d4e1947f3ecf241b93dd380f6fe14ee645abdb + - hash: 9a9499fc123538ae15ce815efeb526d2d07e2bfc + - hash: 68a60d04da5d4fc3023327eabc782b4499c86c3f + - hash: f5f2894c91f599e4a0afbda1dfedb15ff653d2cb + - hash: 41852d4e313974a2626df513ad9ba2d1aa4384b4 + - hash: deab97d3ac096f21bcf33a483623cfaf311afc9f + - hash: a0ce84ce72f0184d2e4e51bf635de0b6bfac7dbe + - hash: 9b37c011951d4835f2a3a605f185298a35958df5 + - hash: 438df6d28011650e24f9da45c48b1f49e0443361 + - hash: c54c4bb86014ee25929d4d61dbd104dd92768ac4 + - hash: 881cd8d879c1eb5ebadb94221873f076092980ae + - hash: d5a17669e1790b1883ded87243beda9d036db58e + - hash: b1e4662ea07aadbb1fa2f0d109d5e5aee8dab789 + - hash: 6b6c5ca00f850d277b283374bf0080c775f02c96 + - hash: e54bde2ec16aecb7b8020c56ad87b7d578716af5 + - hash: 9bf10dcfdfeb721e26c4698b6d2a248e4394d7ff + - hash: b10cf28b0423377005cb5fc3b90e51993ed61e56 + - hash: 287271445e58b0ee2ab670858aff3c6ccc9d8b54 + - hash: 3b01d236a9a3bf6b05327b9e4b7f0ad4402f6db4 + - hash: 99892fe66865bbe2e93dbd69a696b5d7ad9681dd + - hash: 46cfd2c199d2ebe26bcf2ace868e6590024daf30 + - hash: d9c1fd1ca64a1d279ad88edb2a6d0062721f3970 + - hash: 38a6de5e8cf3a2465a3bea267ff28240579a43fc + - hash: a24c44644b0e4f3e75da97f1aeaa73adcb24ef7c + - hash: daeda1e23f42169b38df9b394da5e056165987b3 + - hash: b371c371f8de277e701a5ea83b16cc7c6a86c158 + - hash: a670d36b76db9d12c130ab13f2609b6814962eff + - hash: 19963d3011d3e580b17cb4db605658004b48e01a + - hash: f10b22cc21212ea9dac40fc689e97eafd0f068d4 + - hash: 3f9fe0f245fa1a195b0ec43a0ea4ef829d304d87 + - hash: 915206e108235c15a5e8cd7115ce2cc902414cfe + - hash: ff9650245e3182c0747deac8b29b27d02bdab324 + - hash: ce259b499d377c019aa5e9a0fdbf7252dca7565b + - hash: 4c8a58deb06e11aab2e5a2ba543a50d2b88116fd + - hash: b55befe2d69b2a17ada87b98c3a84259d31ac3fe + - hash: 78d614845b14caf57a127c695bee09ce461b1641 + - hash: 2380729e0cfde7840081be98da6da5d1759f6264 + - hash: 72c6163173e5a3d07dc464963fae2afc29cd2e0e + - hash: 29470f7b8e6c9ac71572a0334cbc92506e7ed46b + - hash: c33eba1ec19f782097918875a5534cca0c483007 + - hash: c729e2716305fb0958cb892008ef32c77639d51a + - hash: 42ec7ed3d767fc7d5a4468bd8874cde88f41b2c6 + - hash: 1f154feeacbf95c601cc833e65a1b301420e6fe4 + - hash: fa7966875f028d6f62453017c737863067abe1dc + - hash: 20867f6f1ce809494772e14f75a7d9d3ababd1ea + - hash: a6351e9164412aaad0089d592f83d90151462db6 + - hash: 4826e169ab107939378ae6cb2b9f3c6d1ae82a1e + - hash: 98024e5afc99ac2fc62031fead372ab06c3f1c56 + - hash: f29f45ca168c8363741c8f8e04ba48679f4fa200 + - hash: b4852dce9941e575ee3f6783a97ae948f3c1d93d + - hash: 588d9305a8467d7ac5c0098c5254b85a94ccc607 + - hash: e4facb657cb37d24b5ffb2af6b7a29e8a2df7961 + - hash: 1f6311d514690252116b3e1114ccd9b2bbaac66a + - hash: c868253d90a9f128af459f2bf1b01cd02346c53c + - hash: 01e00cde1daadf437fe659bbe806bcb9e39c59d4 + - hash: 3d311bb28d6718ca0b7e2fe169eeac5e4a1c4101 + - hash: 952dee60fd2dff1c574d4d4dc566361d814471a9 + - hash: 72d7b8fe0a5927e55fe1b3d6cf55a3b98d9c88fd + - hash: 239e45bdb914a0d55a6a371718f007d73b0a2b82 + - hash: 208d125a6eec5e803634af382bd553075f01d13b + - hash: f51846bc72720c0c1a06a5f8e49c2a66dffe194d + - hash: 78061dfe5aae80954ff0484a7ba350af3ed6c923 + - hash: a53495f3217e2fece6f4e7b161317c7d854c52ea + - hash: 28f7e006ec1a87f00d2deb14e89a1f7566037536 + - hash: f3cced2f867f9c13886f4a44e77e0f2edd96269b + - hash: 9e7c34ee8f3a965295385c67357d742863d4f3e7 + - hash: 194d4b710acf379c0a22065c691cc7169850cc83 + - hash: e6c785cd232c85559ef0b09bc723dab84054a66b + - hash: 9d21950ac968550dcad66e51d1cde0ac23c23d77 + - hash: 8f8950e619c7eb7b95a50363680453f4b8102fb1 + - hash: 8d9169809a4871ac5370d25737896c8cbdc160c9 + - hash: 8ba3a7cd1eef0d355bcd1495f63fe70b77bb523b + - hash: 9c299948adf1a33ee260b47cf0b1d7fc076070b0 + - hash: 940ab1195279eef16c89fc9048f14ebbade73abb + - hash: 1cfd3665ee98659b01e20b2bc9a6d9ac548b1633 + - hash: 84602346f5c0b8c14d8bd8f8094909d5346c46e9 + - hash: b9606f3e2d83f94ccdc0045d157fcf446837c03a + - hash: 26b3ff9673e56912f3a2d40e827138c157cc2a81 + - hash: 6d9e90a5eaf2b03dcf03d47f4e4499b557fe8985 + - hash: 50a555d5b0530e4c71f5d23881227b36883fad29 + - hash: e68303e051df6f247e2a66fc69ae330183693b0d + - hash: 970d3d1bbb1774a39603e4b09762e22b54b0b75e + - hash: cdcb0a425181b9272c14b03a89bdbce9471216ad + - hash: a6027322d5b6c680e61961813d0d95b84de33406 + - hash: 1957d9bef9df5c69442bb9dabd5e7ffef7b0b7ae + - hash: 2a4bf8f34bb9022db7babf3c9d9193aecf722c64 + - hash: 9faf8bc05f8703f053d1f6b729ca63a2b68f9198 + - hash: a36bd194f853a7e3d8897faba7996397dd89aff8 + - hash: 29e788167916463e8f673426a29896562cdd9022 + - hash: 2b404d0267ad5175b2c10128308c339a8565e104 + - hash: afa74290385992521e7d3c09e732b3633e29b4ce + - hash: 2dafbf1c56cfa65c2e7b489643e42b7de4e1f522 + - hash: 1b8a5c1017a31786d579c9345bfd0ec18fea63a3 + - hash: bb586216ea6cfd0ca1ae8f47f90115b0614a1a12 + - hash: eafb8465b0a6a67c2a89eb50290aed453471c52a + - hash: 16d7eb00dc5444a8cf0bc009e965de7cdb34c78a + - hash: fcc106996141824f08f8d9d4eb05ce71869a1031 + - hash: 8273ad0513f387d74cdf8817aebb8627db8a7499 + - hash: a61e92f296e0efe1948cae72dc1bdc88b279cf5a + - hash: 923e7bd2be8166dd143383826276609f99986470 + - hash: 6755674bc231bba9d07adac0ad1ed871ec203a90 + - hash: 7f03a8f3a936dabe0aae0cda1ba785fb0a5eeed9 + - hash: 9658d371ecde0f5a062a1e6f2680e2a0bd1dbc80 + - hash: c3d58085a332d5633f9dc6c7d716c780339515ff + - hash: 827b4a068d9df22c11e9700f83b2855d15609fb1 + - hash: 14a7d638279d1013988a411336ec71b171e128bc + - hash: 7e7fe333de77e98ec0820c850938efbfd3c4b55b + - hash: 662aae1a77e215edacc7de1fa2dccf9dbe9e73f7 + - hash: 0b3e6937dfb49d8d57ead1e885ef451e89ba2a44 + - hash: e3a7cece7b850fa1b0a2860ab327efdae52ce5d1 + - hash: e071365e9a3feda285b7cece6ad80f84167d357b + - hash: fd623581c73b854aa82ea3a5932e0838edff499a + - hash: cc4256986b669ab795a8ccc4c16ef75f17ab7b22 + - hash: 66453459da84708a916d9f2d82ca90467a67b9ea + - hash: 5c8a80e6d57a720499196e02b3ee771daa84f80e + - hash: acb0de2ba89691f55e8817fd2fb66cad252d092a + - hash: 85c12ad43989c804c8ab5a008c256e6fa6c01654 + - hash: 20bc1d4d101263b58dcf7ab68aecb39167af8a6d + - hash: 2567b5812066b0092cbf7fa7c693bf8f9503e378 + - hash: d69efb8825311bddc63ca4019b7b4ec40a5e072c + - hash: 0f8136f29b5298aeec90f16387b716df0f24519e + - hash: 1e7304652df9c952d7bf2fa48831f26bbcc92de0 + - hash: 2b7467b4e7fcfdce5f2d9aecdffd1f864bdab553 + - hash: 934d287e7add0c27541441d5304c819e0a61ee6f + - hash: b2417702abc5ab5df870948a7d4217690cd73c24 + - hash: 9682a14991596e44c69c508a55eeaf52a77a6d89 + - hash: d56cc203e8ae4aaaa38a1da5e3a3aed59fee5de4 + - hash: 7a93c24228987ba874e74b3f25f57b4befc375b8 + - hash: 2fe5afd1fa4f455f4f834c610b48f56cb353d2e7 + - hash: 3e684892ca482446bd401f72f244a27e9e9eac4c + - hash: 633be9a0f8e518d6cf82c9e1b6130e3dda960866 + - hash: f642c3420b76f2c72814a86bc999c1f0199cc0ce + - hash: 72770a85b3fd557cd6f29c33d7cfb60f93aff2f4 + - hash: 52c8befd111650fc69c5a54fe155d3d279b62e56 + - hash: 8d40463c5b93665df82d1d332282ffd01f0ed9fb + - hash: 1c635671be8575bdb5629fc17faf3176e8dad044 + - hash: ba1282b5e8325f0bb794ea8dea0e66cdcf39df14 + - hash: 6a7495a031fa6822542990ef10ccddecccf4bb01 + - hash: 277401705f60741fe6194ae0b559d42e6ebec8bd + - hash: e14ecc26567eae952c5c5d9aec4bcd2e7e25261c + - hash: 0c102336d574e892c06f7c8b776a8bdfd0b8d0f1 + - hash: 9e712754d43c91cf695582b3842ca462c941e28e + - hash: 9d5347ac3b15b0241eef068f580a8fc7aa6b2467 + - hash: 73891cdbb1004e1047cd4584b47b97bf9a97d3a4 + - hash: fbe191e0bd21138bcb286a5980f437fda6f7e9df + - hash: c8a23da26d261d0f111f5598d7fb55ed91e4940b + - hash: 39ca6d6ed96abc99e6ec74ac0243ae9c217b4529 + - hash: 1595dc5024ae21b114bdc5b12b81d93d8691e6cc + - hash: 3482682a5a226460f3da3c1c6100e79b617aa98d + - hash: 4f2574661c32f9557ee95ea6991afea850c0230a + - hash: be8445e6fbf47a93ead0b05d62c65022268808be + - hash: 6e6d215ab7614a74c1e0a30da64c16746cc8f70c + - hash: 82d08523e34f8a3a771ecda3037d8272b14cb28c + - hash: dd4c4eb5a72819bc852e878313f8dcf6d846d222 + - hash: 41c9b5d783a399b1d130ba435c1d124f970e25aa + - hash: b7c3b887e04ae0e85f6e71f474fba0cd571075f5 + - hash: a5d3fb6878b12ccc92c813865deb2781bdf9795c + - hash: 1ca753efc5297bf739964fe74df4b4c1106cfb14 + - hash: 9854bc7287e364570796e1e1161a92f9d2eb2cf7 + - hash: 00f99bc008bfe346601c4e788b61990719f939b3 + - hash: 3603de8304a528ab6538d3c008695491f60f567e + - hash: ca94ebc3b9d275d0ce5a5a2fb566a32046c29253 + - hash: acaaaa9e0f71acda0af6db14eb01bf88e39c50d4 + - hash: ac020891168b6aca46ba07371423dfd7fcfea9c5 + - hash: b593c88a2af695ee7e32e2134f33cd4776a9847d + - hash: 08d9b7eb30f932da225cc7b3ae328cb0fe7390cf + - hash: f8a985ede5047a3ee17dc359ce59a0d27438df44 + - hash: f5fc17db3690e6680012743ed7df9705e9e1b9f8 + - hash: 52c55488820e07520b7ae06d635317fe6264cb19 + - hash: 8e8bb5ede27d68027c43e4b30ba1b3a08f1ff304 + - hash: 1f9a46f965173d94aa47fb1d95f5389555de794b + - hash: 81e9af8a53e576f1f1e9d4df8fae0fe5091fb52c + - hash: 41d4057b1a1e43aee3c3617203eefba88a3ce5cb + - hash: c5249dce04b0dfe4118d030899103a11125cccbc + - hash: e5fa91c1debece9caf51d36d9a007ca5dda6d58c + - hash: 4eb3c2dbd182b714b68bea1cd8ea459a829c6986 + - hash: 91e1eb3d92c09150e170580ac2e7c3e9fb8959eb + - hash: 382249d397146ab57afe50ac5c0573086749bdb3 + - hash: 9982b37853f8976f36b74f85bdaa2ee7697f057d + - hash: bfd7b412ff483d3dda75a2df16b7320c83f01bb2 + - hash: 70fdfc242320b1d1e76a21ae5368fac031d85088 + - hash: 1872d1f65d840451449510b0ca73d0635ae03f0f + - hash: 2d2feda47a2169de158b35e473e0a900c090b140 + - hash: 86d31142dda0f2709ba326920685f4197371eadd + - hash: 78571033303a222e31e3f4417456daa33f40eab2 + - hash: 2387e5a86423c88bc3b1fa3cb3551ce328278795 + - hash: 3c935c493e812bedd89ed423aa852c5ebe24fb08 + - hash: eab1061c2ca32616d5949283ccd0c133aeb77639 + - hash: e5f9ab83c3892a0f06e33fb0d0561040c3d947e5 + - hash: 6559b9a5d2d8c853d4a479b501b4c8e304644af8 + - hash: cb6d8fd0a7fcc8bb5614b804ebad1f5c17c0cbda + - hash: b02e76aea0e55d1f761f145ea87a1bf3deab136e + - hash: 5da231907a4d8116c1850bed8b75e5e2300084dd + - hash: 640b9644b97db30cd0158a171621c5b2ee7df064 + - hash: 719fac0f7fd7a88183122284eacce2bdc35fbd80 + - hash: eb1d87a1044bfeca1afb9352843535b4385caa8e + - hash: 0dd024e64d9ba877cf9ece3734ed1ed01cacb022 + - hash: 79e44d5318cc6ef53f53a6880135a20f835227e1 + - hash: aa2db746c0b3c343c7bc33da20d334853b73ddb5 + - hash: f83fc830af33679a0879d4e3a224569626831334 + - hash: e0fa0f96d8bb16dacc79090fef54008053dfa9d2 + - hash: 0d0308d7a7aa8c92881ba4e4901d18dc928cc197 + - hash: 1bd59bd20b90ea9db402857b1c53de0ecfb86d4a + - hash: d677648fca11f212708eb14d975b3bb21aed5078 + - hash: 7e14bc04d2f6837d43045928b59b2452eafab260 + - hash: a8dbe82665a52a392b436ad0405661d2befe9327 + - hash: ddfb77b468938ce434d33bcf1dc8826bbc224850 + - hash: f7f96203dfa37e4b0589c5377ed8e8f3ec4d1927 + - hash: aaf4f4cd184e92d90950688105213ab7e0555879 + - hash: a67e5e71f2c327b7aeb7381532fd18bd0caee2a4 + - hash: ea7ec4508f519839c045a39cd151e40dd3324c36 + - hash: 7530ab40436fd8faed7307f47f143442660c8a96 + - hash: 7756c6137b03cd4849c80e103d49e35d00669212 + - hash: 7a58a1986998f8e34b5622a262019d771d527bdf + - hash: 921c4223cceef152d995de6edb56d20814e87c73 + - hash: 713c3a8f7498b719c0722a9d263a87d8c814719e + - hash: f468f5ea598f7a91585f2429a54db671ee69ff5f + - hash: 2b61cfaa7c60507f784c73264d06bc023fdc7190 + - hash: ea1a4b8caf43b3a3ed5a5d30a472ddb9b32a411d + - hash: 4f82e1a413e13c0244c592b70bbc7e510f0a3f48 + - hash: 1946cae33e1c31ba70b707cd0ba8031ecafc2e97 + - hash: 420b296a39d51b512a16db4aece5e504ae9496ed + - hash: 6964206739e5a1f55f4e6568904ee10593f1e8bf + - hash: 53ce60b4f9b95773edcdadcf91ac333ac7ff666d + - hash: 3aea3220e3ab7ed04548e016728c1f9a25004c88 + - hash: 0104b7e18de54337206f554655645cd25a80b58c + - hash: e491663840214684068d6d53362c52d5aaff6cad + - hash: 425032d17f36132c520f7c085a42fb3e52607db8 + - hash: 20349a9f9e76df65127e2ff815face9996b8b027 + - hash: f6b005660d68c2276357c77c810e60d412e3eca9 + - hash: b78f6adf57d9bbffc457a20c2aee626f8373f5a2 + - hash: f9e491edd3b2045e540f2b4cc23a65a3cd3a41f6 + - hash: a494cadd9c3b4e04ed0ab4564d3991fa33a120e1 + - hash: 5de5504f79f092f973c676cdaae03b3dd7fde6d6 + - hash: 33bcab83bb0a853ee91224a22862483ed58b8241 + - hash: 16b5c19b72c159cfedd8f4b2d9f5d85856183c99 + - hash: ebca2e3a9fcb5f9d5a0fc7ff0ad2b06901008f5f + - hash: 6fd293f147dd08093deff03073027e2e27bb990b + - hash: d422e412b1bdde87f8c6cfc73e5b8aa0eed3acd2 + - hash: 826093896068d52a1fb19f0cb9bf06152feeda11 + - hash: 5a38656a2dce514941edc07689a216692a57c187 + - hash: 6725eabd92cca5512c3572f8b58145561c3304b8 + - hash: e2cafedf24b99f74740beecf5b21ff9141969aab + - hash: 50eb0b2aaecec38b457446e58a76cf7e283f6950 + - hash: 30c5688999cc846cf9d07b52145fbe7dd808a201 + - hash: 670fbde62b548f10f18e1a8b03282039da506c9d + - hash: 484e0919a4a87076d3bc9159e078118e19b81935 + - hash: 3a184fcaeef1a08550a180ae434247ada92573a3 + - hash: 4a23f2a8191771a2403ae3b7a4200aa4186e5ab3 + - hash: fb6e2e48a0996830ba94009a4d4f2a24b920bbc1 + - hash: 3627dfaec73f6dcea97fe35209b13769e0de7a90 + - hash: 1ec1b0713080edc9b53a939ea79e824bf9e99547 + - hash: ec9abd5037195ca76add7aab755afe10cee07d86 + - hash: d5957c66fbfc0ec14b6a5864224c01bccc27af1a + - hash: 3b1051a9a57c803d5618c3a95029eeed8c0174ac + - hash: 2f8608a5694ebc84fe0fb72f066419cbde8f4d8f + - hash: 741b8123c51de805c48d18b6086b6f6d21cd5d97 + - hash: 5bd52a6373e7d536289617aad7fc4c2699b3270d + - hash: d5fd01ffeaeb80e47d6d96e6bac7574c72b77f6b + - hash: 712f543cdfc2edfd95178051df7408848b3ed718 + - hash: 0acb5e40fa09959a8a952b6d7dc9127db4ae2807 + - hash: 9a5ce56a470aae10d5ed5ebf46d5d0de74234355 + - hash: 5f88289136890f46e21da37c18aab792557b7b1e + - hash: cef0cc06716275430f6348bf9b58fea52e3c1b76 + - hash: 4db5ef01579c8cb997c62e957eef1ee32de8e873 + - hash: f2ca0f3d6ba8a71cfe63acbf9bfb3cc5deddfce5 + - hash: fcf39d172fcf1bd201c8f103218979aaf3ab8a67 + - hash: e16fcfef6d8c0b8e60d61ecea1e278b46972562e + - hash: b6acb17f02bc8ff1078f4032051c65693e7c4659 + - hash: 384270cd4c590b2d040398697b6268c8bd78bfa8 + - hash: 283bf06ada6f62e2bc862ba28c3095cd855b4bf0 + - hash: b48528ddd9159d6107708d2e8d32b5c9f4790f77 + - hash: 546f8c6ebb0854c29f325d79a2cf5b6d61d8256d + - hash: 0ddc7bdf4270d2657e8a2711286e53a5ab5e0a35 + - hash: 36b079852faebec0afd1f1f59539f14164e3149d + - hash: 902c1576b86f350ef11730f0337ac386439215d9 + - hash: e3298ccbcaf22203a85cd04ad2ce33bb498e6e28 + - hash: a6907907226439bddef56bc5685f83e1a41b4845 + - hash: 29e9a34b16db85bbeb575687286e6529c1a3140e + - hash: f84c331b81b59d677fd0e15dff3dc35953e89e73 + - hash: 0cf4c94e2d687238966e39423c6a0c5c7990cd2e + - hash: 9db30439558e94f867e9a03749e7623e872fd66a + - hash: 35d027f6bb2e2073da3e214ef7d435e83a16e0cc + - hash: 69d18170b9ab046a889a8f2f5c8d61aef04f6338 + - hash: b3ac22faff74ae8b2b1025b41111b2388f4a0e7a + - hash: e86da94393d649768798d7e4fdc2a57b03562ee3 + - hash: 6dcf1ab44d56184d57b0b4e539798a5df1e3a5dc + - hash: 517b4cb73f84605678bc0b30030da1fd157a6afc + - hash: 20fd282c198230f32dcc0c3de1f4ace253bc9145 + - hash: 7e2be3dd94f1841e2e43bce8f0e6bc1704fd50d2 + - hash: c87ec36eaf59256a33d3cc092097635f30f8168f + - hash: 288f62675709e441a9a841f60efe352e8390e34e + - hash: 8521775af18e07c70422e810b242480ca123fd26 + - hash: 4e7adef224edb5a4107ce19b5c890ca555c8bc08 + - hash: 081f8f6c915c07c5d81d1d5ef7b3e810d5c262f5 + - hash: 46711a12959fc22f0e35b0a530e596c850183479 + - hash: 5133bef8d850047d399e3017be21532b8c95f879 + - hash: 12f2d51d38b4caf697ab67d479a0bafb48040f23 + - hash: f876293d57429ad7f6ea025f6db7708b4c524bfb + - hash: 38be3f605f40f993eb655bb635d8c88180d4ed51 + - hash: a2089991b4f187a2eab4cece647b58e8bee10322 + - hash: 2e53148fdf77deb9f6617e7c0e1c26b27d054ebe + - hash: b40212e3d7291ff2ff2a812ef5ae5d9dbf1b58cd + - hash: 59f98fa1f507ba8eadafe2ad3d427a30093d58cc + - hash: da73cc19bc4c0cac731ef8e0e6d8259c068af282 + - hash: dc1e013a4e806c48e37a4961bb41bd4a421a47db + - hash: fe8f873fcb1f645bf192f40d0aaec61ffebe691d + - hash: 40cd5813349de27c12cc4cc801ad9c71e38ba354 + - hash: 3dae8bbc763a7c249ec1dde3dd17eedb36619f34 + - hash: 38c3e92ef34a08dd65eea6a6b3483d663cc81cfc + - hash: d34056078726865784034e513fc31226eb5f156c + - hash: b65a6bd58b8a696f421b8324631c540f7dd6ae27 + - hash: b863a233febf14a2037c163d29467a9c9cb769dd + - hash: f0466a9dd353b6135c3cdc405212bc5ac270a0d4 + - hash: d0e16b1575f8117e5c348a84ab0d05b37bd20553 + - hash: 4baecd5ca4121f9fded5622ed8657f0aa3e64be3 + - hash: ee36558f3607b13db4024c8ac393ea22be6049ce + - hash: a6106adc47cad915422fe7d9b2ca33178039fc41 + - hash: e8d604bdb464a69ce9785a166d16d894422ea402 + - hash: 45fddc882bba92a95bab5f1707f2fafe6162fc2e + - hash: 167f36e5ecd20ef9a602381a20886987a4f48b98 + - hash: 9d6ae4dfaa1146f11796ce9006708494c86a66b3 + - hash: c27c9c3a2fc8f885d9725e6c3c6cd905405c975a + - hash: b8caf17e9aedba50f170a1457b10daa7c5eddd68 + - hash: 5cc711ac1e0d2a73d88544fca6f250c66d75c5a7 + - hash: 3130ccba7c1a1464dee7d7e774c1dae4889714f1 + - hash: 20d96684cd72d8dbe5c9e00f07bad40524f17434 + - hash: dca6c783d2d6a1ddc1b16b43e57e488de85927bd + - hash: a14e5235ff28b2a8ed1867d28459716819764171 + - hash: 5001d84e9ae205c0b8327bb69ac891c58ef2b990 + - hash: 53b3daa335d90c5c60d74fcf8c8ec7c268e72272 + - hash: a4ebe8af50a6c138edb711a7a68566210cd59abb + - hash: 3bdaadcfb8c21615e87e878ccd8639c478af72d5 + - hash: 244d5ca727793c39b5943bd0fe1ee09b3dd76207 + - hash: 832d6843dfabc82dd4d9f20ed6ceae154db94f5f + - hash: 61cd5a1ffe5fbec963683e56b8494368331474bf + - hash: 10b714a2ce4008bb6dc44bc82a81e03313332573 + - hash: 4ef7dae3c41863a9eced2a12dc86d50667386fa1 + - hash: f5c9a3a32ac33100b66da6d0c07ab0c1ad0d26b8 + - hash: 472f91a504d6e96dbe0e7ec5361ff039f486dc99 + - hash: 797a2531589d04970bba4b717ba171de5bbad254 + - hash: 18a160698845690286f64b5b7c1bf434be93b61a + - hash: 7b48eeb993aa5e091db675ecbdb3405a3a60c7c6 + - hash: c75b4b307a12f8cf2ee5f36f5d408a7e18d6de89 + - hash: bac70c667f5c670d4d60b136b750a052ffaec31e + - hash: 34907765dffe0e75bfedef078748a1a19f25de25 + - hash: e54135745066d8f1525d0caee353167b6de22e58 + - hash: d47eaa8a2a496decad91e5b71e95925bb45d7354 + - hash: 01ec52f4d7cbbcb31374d72127da90217e7d9ed9 + - hash: 5d52b19c2b52654e18e8df47f9e123b0bc3d36b6 + - hash: abdee7fe1036ca546ea723c30cce54993916c8ac + - hash: 482b0a52ee16f808295f7b5806c1869a127ad53a + - hash: 6f7ea4e7724720684c65ac82548a5aa06292b99a + - hash: 79b16beaf0d1fa7085e611827e648069e3284ec3 + - hash: 9bd0ccd5504e660f5bbe9f77248f62dd755d0d47 + - hash: e3ed0af0f975206dedefb33ea3dc4b26ab3933d8 + - hash: 8b5c1a7c419e525fa1b91bd9935cb0e78d09cafe + - hash: 05a57904009d71f102265593bba759118784c192 + - hash: cb8da11b8924f0ff02ab395883b3f172b7dd2eba + - hash: eaa3782f060490f16bb7ab07fa3487469e3feed0 + - hash: f530dfcc3ce02104029b7331344afbd73f113781 + - hash: 53a026eee016019cf0923349218d0ee9f37f24e4 diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..0f92c94 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,3099 @@ +# Change Log + +All notable changes to this project will be documented in this file. +This project adheres to [Semantic Versioning](http://semver.org/). + +# v2.1.6 +## (2026-05-13) + +* Fix MacOS x86 build by switching to the macos-14-large GH runner [Thodoris Greasidis] + +# v2.1.5 +## (2026-05-07) + +* Replace the EOL macos-13 test runners with macos-14 [Thodoris Greasidis] +* Add libgdk-pixbuf dependency alternatives to fix Ubuntu 26.04 installation [Thodoris Greasidis] + +# v2.1.4 +## (2025-07-29) + +* patch: fix ubuntu 24 build and flash issues - bump electron-forge to 7.8.1 - bump electron to 37.2.4 - stop producing broken appimage [Edwin Joassart] +* patch: fix windows build and flash issues - downgrade flasher's node to 20.11.1 on windows - bump windows GHA runner to 2022 - bump winusb-driver-generator to 2.1.9 [Edwin Joassart] +* patch: refactor permission code [Edwin Joassart] + +# v2.1.3 +## (2025-05-15) + +* Remove stale secrets [Anton Belodedenko] + +# v2.1.2 +## (2025-05-08) + +* patch: remove analytics [Edwin Joassart] + +# v2.1.1 +## (2025-05-05) + +* patch: fix signin windows artifacts [Edwin Joassart] + +# v2.1.0 +## (2025-02-27) + +* Add informational notice about how to disable analytics collection [myarmolinsky] + +# v2.0.0 +## (2025-02-20) + +* major: build on ubuntu 22 and macos 13 [Edwin Joassart] + +# v1.19.25 +## (2024-10-10) + +* patch: bump etcher-sdk to 9.1.2 [Edwin Joassart] + +# v1.19.24 +## (2024-10-09) + +* patch: etcher-util is corrupted in RPM package [Richard Glidden] + +# v1.19.23 +## (2024-10-09) + +* patch: remove gconf2 libgconf-2-4 deps [Marc-Aurèle Brothier] + +# v1.19.22 +## (2024-07-18) + +* Replace deprecated Flowzone inputs [Kyle Harding] + +# v1.19.21 +## (2024-05-30) + +* patch: fix missing windows dependency [Edwin Joassart] +* patch: fix missing windows dependency [Edwin Joassart] +* patch: fix missing windows dependency [Edwin Joassart] + +# v1.19.20 +## (2024-05-30) + +* patch: fix missing windows dependency [Edwin Joassart] + +# v1.19.19 +## (2024-05-28) + +* patch: add sentry debug flag [Edwin Joassart] + +# v1.19.18 +## (2024-05-22) + +* patch: fix Sentry DSN for main process [Edwin Joassart] + +# v1.19.17 +## (2024-05-09) + +* patch: fix injection of analytics key at build time [JOASSART Edwin] + +# v1.19.16 +## (2024-04-26) + +* patch: hold request for metadata while waiting for flasher [Edwin Joassart] + +# v1.19.15 +## (2024-04-26) + +* patch: bump etcher-sdk to 9.0.11 to fix url loading using http/2 [Edwin Joassart] + +# v1.19.14 +## (2024-04-25) + +* patch: pretty-bytes to 6.1.1 [JOASSART Edwin] + +# v1.19.13 +## (2024-04-25) + +* patch: use etcher icon as loading for windows installer [Edwin Joassart] +* patch: fix windows squirrel install [Edwin Joassart] + +# v1.19.12 +## (2024-04-25) + +* patch: bump minors & patch [Edwin Joassart] +* patch: bump @electron-forge/* to 7.4.0 [Edwin Joassart] +* patch: bump electron to 30.0.1 & @electron/remote to 2.1.2 [Edwin Joassart] +* patch: npm upgrade [Edwin Joassart] +* patch: bump @balena/lint to 8.0.2 and fix formating [Edwin Joassart] +* patch: fix pretty-bytes imports [Edwin Joassart] +* patch: bump etcher-sdk to 9.0.9 [Edwin Joassart] + +# v1.19.11 +## (2024-04-25) + +* patch: setup wdio and port (most) tests [Edwin Joassart] + +# v1.19.10 +## (2024-04-23) + +* patch: remove node-ipc and tests [Edwin Joassart] +* patch: switch api; use ws; integrate sudo-prompt - switch api roles flow - use websocket instead of node-ipc - integrate; modernize; simplify and deprecate sudo-prompt [Edwin Joassart] +* patch: refactor api to use a single topic [Edwin Joassart] +* patch: set require node engine to 20 [Edwin Joassart] + +# v1.19.9 +## (2024-04-22) + +* patch: prevent rebuild of native deps by @electron/rebuild [Edwin Joassart] + +# v1.19.8 +## (2024-04-22) + +* patch: replace deprecated pkg with yao-pkg and bump etcher-util node v to 20.10 [Edwin Joassart] + +# v1.19.7 +## (2024-04-22) + +* patch: fix formating [Edwin Joassart] +* patch: configure prettier in the project to use balena-lint configuration [Edwin Joassart] + +# v1.19.6 +## (2024-04-19) + +* patch: fix win signature process [Edwin Joassart] + +# v1.19.5 +## (2024-02-14) + +* Replace deprecated flowzone input tests_run_on [Kyle Harding] + +# v1.19.4 +## (2024-01-26) + +* patch: remove screensaver error when not on etcher-pro [Edwin Joassart] +* patch: fix typo in IPC server id [Edwin Joassart] + +# v1.19.3 +## (2023-12-22) + +* Update dependencies [Edwin Joassart] + +# v1.19.2 +## (2023-12-22) + +* fix: typos [Rotzbua] + +# v1.19.1 +## (2023-12-22) + +* patch: update winget-releaser v2 [Vedant] + +# v1.19.0 +## (2023-12-21) + +* Use native ARM runner for Apple Silicon builds [Akis Kesoglou] +* Calculate and upload build artifact sha256 checksums [Akis Kesoglou] +* Migrate build pipeline to Electron Forge [Akis Kesoglou] + +# v1.18.14 +## (2023-12-20) + +* Remove repo config from flowzone.yml [Kyle Harding] +* Update actions/upload-artifact to v4 [Kyle Harding] + +# v1.18.13 +## (2023-10-16) + +* patch: upgrade to electron 25 [Edwin Joassart] +* patch: refactor scanner, loader and flasher out of gui + upgrade to electron 25 [Edwin Joassart] + +# v1.18.12 +## (2023-07-19) + +* Update instructions for installing deb file [Jorge Capona] + +# v1.18.11 +## (2023-07-13) + +* fix: prevent stealing window focus from auth dialog [leadpogrommer] + +# v1.18.10 +## (2023-07-12) + +* spelling: validates [Josh Soref] +* spelling: undefined [Josh Soref] +* spelling: except if [Josh Soref] + +# v1.18.9 +## (2023-07-12) + +* Fix opening links from within SafeWebView [Akis Kesoglou] + +# v1.18.8 +## (2023-04-26) + +* Patch: Fix Support link [Oliver Plummer] + +# v1.18.7 +## (2023-04-25) + +* patch: update docs to remove cloudsmith install instructions for linux [Edwin Joassart] + +# v1.18.6 +## (2023-03-21) + +* add-flash-with-etcher-to-docs [Lizzie Epton] + +# v1.18.5 +## (2023-03-09) + +* patch: add apt-get update in flowzone preinstall [Edwin Joassart] + +# v1.18.4 +## (2023-03-02) + +* patch: bump etcher-sdk to 8.3.1 [JOASSART Edwin] + +# v1.18.3 +## (2023-02-22) + +* fix-typo [Lizzie Epton] +* edits-to-info-about-efp [Lizzie Epton] +* Add reference to etcher-efp in publishing.md [Edwin Joassart] + +# v1.18.2 +## (2023-02-21) + +* patch: organize docs [mcraa] +* patch: actualized develop guide [mcraa] +* patch: updated commit message guide [mcraa] +* add-item-from-FAQs [Lizzie Epton] +* patch: removed gt characters from contributing guide [mcraa] +* patch: added docosaurus site name [mcraa] + +# v1.18.1 +## (2023-02-15) + +* patch: use @electron/remote for locating rpiboot files [mcraa] + +# v1.18.0 +## (2023-02-14) + +* Update to Electron 19 [Akis Kesoglou] +* Remove Spectron and related (low-value) tests [Akis Kesoglou] + +# v1.17.0 +## (2023-02-14) + +* Update to Electron 17 and Node 16 [Akis Kesoglou] + +# v1.16.0 +## (2023-02-14) + +* Update to Electron 14 [Akis Kesoglou] + +# v1.15.6 +## (2023-02-13) + +* patch: app: i18n: Translation: Update zh-TW strings * Improve translate. * Sync layout with English strings ts file. [Edward Wu] + +# v1.15.5 +## (2023-02-03) + +* revert auto-update feature [JOASSART Edwin] + +# v1.15.4 +## (2023-02-02) + +* Switch to `@electron/remote` [Akis Kesoglou] + +# v1.15.3 +## (2023-02-02) + +* move EFP & success-banner to efp.balena.io [Edwin Joassart] + +# v1.15.2 +## (2023-02-02) + +* Remove configuration remote update [Edwin Joassart] + +# v1.15.1 +## (2023-02-01) + +* Remove redundant resinci-deploy build step [Akis Kesoglou] +* Lazily import Electron from child-writer process [Akis Kesoglou] + +# v1.15.0 +## (2023-01-27) + +* Add support for Node 18 [Akis Kesoglou] + +# v1.14.3 +## (2023-01-19) + +* patch: fixed mac sudo on other languages [Peter Makra] + +# v1.14.2 +## (2023-01-17) + +* patch: revert to lockfile v1 [Peter Makra] +* patch: update etcher-sdk for cm4v5 [builder555] + +# v1.14.1 +## (2023-01-16) + +* fix disabled-screensaver unhandled exception outside balena-electron env [Edwin Joassart] + +# v1.14.0 +## (2023-01-16) + +* Anonymizes all paths before sending [Otávio Jacobi] +* patch: Sentry fix path [Edwin Joassart] +* Remove personal path on etcher [Otávio Jacobi] +* Unifying sentry reports in a single project [Edwin Joassart] +* Removes corvus in favor of sentry and analytics client [Otávio Jacobi] +* Removes corvus in favor of sentry and analytics client [Otávio Jacobi] + +# v1.13.4 +## (2023-01-12) + +* Adding EtcherPro device serial number to the Settings modal [Aurelien VALADE] + +# v1.13.3 +## (2023-01-11) + +* patch: progress cm4 to second stage [Peter Makra] + +# v1.13.2 +## (2023-01-02) + +* patch: fixed winget parameter name [mcraa] + +# v1.13.1 +## (2023-01-02) + +* patch: updated sdk to fix bz2 issue [Peter Makra] +* patch: update copyright in electron-builder [JOASSART Edwin] + +# v1.13.0 +## (2022-12-28) + +* minor: electron version bump [Peter Makra] +* patch: handle ext2fs with webpack [Peter Makra] +* Patch: update etcher-sdk version to fix CM4 issues [builder555] + +# v1.12.7 +## (2022-12-20) + +* Update dependency i18next to 21.10.0 [Renovate Bot] + +# v1.12.6 +## (2022-12-20) + +* Update dependency react-i18next to 11.18.6 [Renovate Bot] + +# v1.12.5 +## (2022-12-20) + +* Patch: made trim setting more readable [builder555] + +# v1.12.4 +## (2022-12-19) + +* patch: publish to winget with gh action [Begula] + +# v1.12.3 +## (2022-12-19) + +* Patch: replaced plain text with i18n in settings [builder555] + +# v1.12.2 +## (2022-12-16) + +* Update dependency webpack-dev-server to 4.11.1 [Renovate Bot] + +# v1.12.1 +## (2022-12-16) + +* Patch: expose trim ext{2,3,4} setting [builder555] + +# v1.12.0 +## (2022-12-14) + +* i18n support and Chinese translation [ab77] +* minor: optimize i18n [r-q] + +# v1.11.10 +## (2022-12-13) + +* Update dependency webpack-cli to 4.10.0 [Renovate Bot] + +# v1.11.9 +## (2022-12-12) + +* Update dependency webpack to 5.75.0 [Renovate Bot] + +# v1.11.8 +## (2022-12-12) + +* Update dependency awscli to 1.27.28 [Renovate Bot] + +# v1.11.7 +## (2022-12-12) + +* Update dependency uuid to 8.3.2 [Renovate Bot] + +# v1.11.6 +## (2022-12-12) + +* Update dependency tslib to 2.4.1 [Renovate Bot] +* Patch: run linux build on ubuntu-20.04 [Edwin Joassart] + +# v1.11.5 +## (2022-12-10) + +* Update dependency ts-loader to 8.4.0 [Renovate Bot] + +# v1.11.4 +## (2022-12-10) + +* Update dependency styled-components to 5.3.6 [Renovate Bot] + +# v1.11.3 +## (2022-12-10) + +* Update dependency terser-webpack-plugin to 5.3.6 [Renovate Bot] + +# v1.11.2 +## (2022-12-10) + +* Update dependency string-replace-loader to 3.1.0 [Renovate Bot] + +# v1.11.1 +## (2022-12-10) + +* Update dependency sinon to 9.2.4 [Renovate Bot] + +# v1.11.0 +## (2022-12-10) + +* Update dependency shyaml to 0.6.2 [Renovate Bot] + +# v1.10.29 +## (2022-12-10) + +* Update dependency awscli to 1.27.27 [Renovate Bot] + +# v1.10.28 +## (2022-12-10) + + +
+ Update dependency rendition to 19.3.2 [Renovate Bot] + +> ## rendition-19.3.2 +> ### (2020-12-29) +> +> * Add Breadcrumbs component export [JSReds] +> +> ## rendition-19.3.1 +> ### (2020-12-29) +> +> * Fix max-width on breadcrumbs container [JSReds] +> +> ## rendition-19.3.0 +> ### (2020-12-29) +> +> * Add Breadcrumbs component [JSReds] +> + +
+ +# v1.10.27 +## (2022-12-09) + +* Update dependency redux to 4.2.0 [Renovate Bot] + +# v1.10.26 +## (2022-12-09) + +* Update dependency pretty-bytes to 5.6.0 [Renovate Bot] + +# v1.10.25 +## (2022-12-09) + +* Update dependency pnp-webpack-plugin to 1.7.0 [Renovate Bot] + +# v1.10.24 +## (2022-12-09) + +* Update dependency node-ipc to 9.2.1 [Renovate Bot] + +# v1.10.23 +## (2022-12-09) + +* Update dependency mocha to 8.4.0 [Renovate Bot] + +# v1.10.22 +## (2022-12-09) + +* Update dependency mini-css-extract-plugin to 1.6.2 [Renovate Bot] + +# v1.10.21 +## (2022-12-09) + +* Update dependency lint-staged to 10.5.4 [Renovate Bot] + +# v1.10.20 +## (2022-12-09) + +* Update dependency husky to 4.3.8 [Renovate Bot] + +# v1.10.19 +## (2022-12-09) + +* Update dependency esbuild-loader to 2.20.0 [Renovate Bot] + +# v1.10.18 +## (2022-12-09) + +* Update dependency electron-updater to 4.6.5 [Renovate Bot] + +# v1.10.17 +## (2022-12-09) + +* Update dependency electron-notarize to 1.2.2 [Renovate Bot] + +# v1.10.16 +## (2022-12-08) + +* Update dependency awscli to 1.27.26 [Renovate Bot] + +# v1.10.15 +## (2022-12-08) + +* Update dependency electron-builder to 22.14.13 [Renovate Bot] + +# v1.10.14 +## (2022-12-08) + +* Update dependency debug to 4.3.4 [Renovate Bot] + +# v1.10.13 +## (2022-12-08) + +* Update dependency awscli to 1.27.25 [Renovate Bot] + +# v1.10.12 +## (2022-12-08) + +* Update dependency css-loader to 5.2.7 [Renovate Bot] + +# v1.10.11 +## (2022-12-07) + +* Update dependency awscli to 1.27.24 [Renovate Bot] + +# v1.10.10 +## (2022-12-07) + +* Update dependency @types/node to 14.18.34 [Renovate Bot] + +# v1.10.9 +## (2022-12-06) + +* Enable repository configuration [ab77] + +# v1.10.8 +## (2022-12-05) + +* Update dependency chai to 4.3.7 [Renovate Bot] + +# v1.10.7 +## (2022-12-05) + +* Use core workflow for GitHub publish [ab77] + +# v1.10.6 +## (2022-12-02) + +* Dummy update to fix asset version issue [Edwin Joassart] + +# v1.10.5 +## (2022-12-02) + +* Patch: run linux build on ubuntu-18.04 [Edwin Joassart] + +# v1.10.4 +## (2022-12-01) + +* patch: remove Homebrew instructions in README [Patrick Linnane] + +# v1.10.3 +## (2022-12-01) + +* Allow external contributors [ab77] + +# v1.10.2 +## (2022-11-25) + +* Fix missing analytics token [Edwin Joassart] + +# v1.10.1 +## (2022-11-21) + +* Fixing call to electron block screensaver methods invocation [Aurelien VALADE] + +# v1.10.0 +## (2022-11-10) + +* testing renovate [builder555] + +# v1.9.0 +## (2022-11-08) + +* Update dependency awscli to 1.27.5 [Renovate Bot] + +# v1.8.17 +## (2022-11-08) + +* Update dependency @types/react-dom to 16.9.17 [Renovate Bot] + +# v1.8.16 +## (2022-11-08) + +* Update dependency @types/react to 16.14.34 [Renovate Bot] + +# v1.8.15 +## (2022-11-08) + +* CI: generalise artefact handling [ab77] + +# v1.8.14 +## (2022-11-08) + +* Update dependency @types/node to 14.18.33 [Renovate Bot] + +# v1.8.13 +## (2022-11-08) + +* Update dependency @types/copy-webpack-plugin to 6.4.3 [Renovate Bot] + +# v1.8.12 +## (2022-11-08) + +* Update dependency @fortawesome/fontawesome-free to 5.15.4 [Renovate Bot] + +# v1.8.11 +## (2022-11-08) + +* Update dependency @balena/lint to 5.4.2 [Renovate Bot] + +# v1.8.10 +## (2022-11-08) + + +
+ Update dependency sys-class-rgb-led to 3.0.1 [Renovate Bot] + +> ## sys-class-rgb-led-3.0.1 +> ### (2021-07-01) +> +> * patch: Delete Codeowners [Vipul Gupta] +> +
+ +# v1.8.9 +## (2022-11-08) + +* Update dependency semver to 7.3.8 [Renovate Bot] + +# v1.8.8 +## (2022-11-08) + +* Update dependency omit-deep-lodash to 1.1.7 [Renovate Bot] + +# v1.8.7 +## (2022-11-08) + +* Update dependency immutable to 3.8.2 [Renovate Bot] + +# v1.8.6 +## (2022-11-08) + +* Update dependency electron-rebuild to 3.2.9 [Renovate Bot] + +# v1.8.5 +## (2022-11-08) + +* Update dependency electron-mocha to 9.3.3 [Renovate Bot] + +# v1.8.4 +## (2022-11-08) + +* Update dependency @types/webpack-node-externals to 2.5.3 [Renovate Bot] + +# v1.8.3 +## (2022-11-08) + +* Update dependency @types/tmp to 0.2.3 [Renovate Bot] + +# v1.8.2 +## (2022-11-08) + +* Generate release notes with git [ab77] + +# v1.8.1 +## (2022-11-07) + +* Update dependency @types/mime-types to 2.1.1 [Renovate Bot] + +# v1.8.0 +## (2022-11-07) + +* Update scripts/resin digest to 652fdd4 [Renovate Bot] + +# v1.7.15 +## (2022-11-07) + +* Build targets individually [ab77] + +# v1.7.14 +## (2022-11-07) + +* Update dependency lodash to 4.17.21 [SECURITY] [Renovate Bot] + +# v1.7.13 +## (2022-11-07) + +* Update release notes on finalize [ab77] + +# v1.7.12 +## (2022-11-07) + +* Avoid duplicate releases [ab77] + +# v1.7.11 +## (2022-11-07) + +* Only run finalize on Linux runners [ab77] + +# v1.7.10 +## (2022-11-07) + +* Switch to Flowzone [ab77] + +# v1.7.9 +## (2022-04-22) + +* patch: update allowed extensions to include deb afterinstall in build [mcraa] +* patch: add update notification [Peter Makra] +* patch: fix usb-device-boot link in README [Andrew Scheller] +* Fix application directory for Debian postinst script [Ken Bannister] + +# v1.7.8 +## (2022-03-18) + +* patch: complete suse uninstall readme [Peter Makra] +* patch: completed suse instructions [Peter Makra] +* patch: order rpm instrictions [Peter Makra] +* patch: enabled update notification for version 1.7.8 [Peter Makra] +* patch: updated title to balenaEtcher [Peter Makra] +* patch: cleanup and organize readme [Peter Makra] +* patch: extend cloudsmith attribution in readme [Peter Makra] +* Update macOS Icon to Big Sur Style [Logicer] + +# v1.7.7 +## (2022-02-22) + +* patch: clarified update check [Peter Makra] +* patch: autoupdate stagingPercentage check, include default [Peter Makra] + +# v1.7.6 +## (2022-02-21) + +* patch: version number notification [Peter Makra] +* patch: fixed typos in template [Peter Makra] +* patch: add requirements and help to issue template [mcraa] +* patch: add requirements and help to issue template [mcraa] + +# v1.7.5 +## (2022-02-21) + +* patch: fix flashing from URL when using basic auth [Marco Füllemann] + +# v1.7.4 +## (2022-02-21) + +* patch: set version update notification 1.7.3 [Peter Makra] +* patch: updated electron to 12.2.3 [Peter Makra] +* patch: updated electron to 12.2.3 [Peter Makra] + +# v1.7.3 +## (2021-12-29) + +* patch: fix mesage of null [Peter Makra] + +# v1.7.2 +## (2021-12-21) + +* patch: fixed open from browser on windows [Peter Makra] + +# v1.7.1 +## (2021-11-22) + +* patch: Revert back to electron-rebuild [Lorenzo Alberto Maria Ambrosi] +* patch: Disallow TS in JS [Lorenzo Alberto Maria Ambrosi] +* patch: Remove esInterop TS flag [Lorenzo Alberto Maria Ambrosi] +* patch: Use @balena/sudo-prompt [Lorenzo Alberto Maria Ambrosi] +* patch: Update rpiboot guide link [Lorenzo Alberto Maria Ambrosi] +* patch: Improve webpack build time [Lorenzo Alberto Maria Ambrosi] + +# v1.7.0 +## (2021-11-09) + +* patch: Add missing @types/react@16.8.5 [Lorenzo Alberto Maria Ambrosi] +* patch: Use npm ci in Makefile [Lorenzo Alberto Maria Ambrosi] +* patch: Add draft info boxes for system information [Lorenzo Alberto Maria Ambrosi] +* patch: Remove electron-rebuild package [Lorenzo Alberto Maria Ambrosi] +* patch: Make electron a dev. dependency [Lorenzo Alberto Maria Ambrosi] +* patch: Remove electron-rebuild package [Lorenzo Alberto Maria Ambrosi] +* patch: Use exact modules versions [Lorenzo Alberto Maria Ambrosi] +* patch: Update etcher-sdk from v6.2.5 to v6.3.0 [Lorenzo Alberto Maria Ambrosi] +* Fix write step for Http file process [JSReds] +* patch: Fix linting errors [Lorenzo Alberto Maria Ambrosi] +* minor: Refactor dependencies installation to avoid custom scripts [Lorenzo Alberto Maria Ambrosi] +* patch: Fix LEDs init error [Lorenzo Alberto Maria Ambrosi] + +# v1.6.0 +## (2021-09-20) + +* Add support for basic auth when downloading images from URL. [Marco Füllemann] +* patch: Update etcher-sdk from v6.2.1 to v6.2.5 [Lorenzo Alberto Maria Ambrosi] +* Update Makefile to Apple M1 info [David Gaspar] +* Add LED settings for potentially different hardware [Lorenzo Alberto Maria Ambrosi] + +# v1.5.122 +## (2021-09-02) + +* Restore image file selection LED-drive pathing [Lorenzo Alberto Maria Ambrosi] +* Update scripts submodule [Lorenzo Alberto Maria Ambrosi] +* Change LEDs colours [Lorenzo Alberto Maria Ambrosi] +* Windows images now show the proper warning again [Lorenzo Alberto Maria Ambrosi] +* Fix Update and install with DNF instructions [Mohamed Salah] +* Add possibile authorization as a query param [JSReds] +* update the windows part [Xtraim] +* Update SUPPORT.md [thambu1710] +* replace make webpack with npm run webpack [Seth Falco] +* Add loader on image select [JSReds] +* add pnp-webpack-plugin [Zane Hitchcox] +* Remove redundant codespell dependency/tests [Lorenzo Alberto Maria Ambrosi] + +# v1.5.121 +## (2021-07-05) + +* patch: Delete Codeowners [Vipul Gupta] +* Add source maps for devtools [Lorenzo Alberto Maria Ambrosi] +* Clone submodules when initializing modules [Lorenzo Alberto Maria Ambrosi] +* patch: Select drive on list interaction rather than modal closing [Lorenzo Alberto Maria Ambrosi] + +# v1.5.120 +## (2021-05-11) + +* Update README to reference Cloudsmith [Lorenzo Alberto Maria Ambrosi] + +# v1.5.119 +## (2021-04-30) + +* Update readme for new PPA provider [Lorenzo Alberto Maria Ambrosi] + +# v1.5.118 +## (2021-04-27) + +* patch: development environment [Zane Hitchcox] +* patch: watch files for electron [Zane Hitchcox] + +# v1.5.117 +## (2021-04-02) + +* Rename mac releases (keep old naming) [Alexis Svinartchouk] +* Disable spectron tests on macOS [Alexis Svinartchouk] +* Update electron to v12.0.2 [Alexis Svinartchouk] + +
+ Update etcher-sdk from 6.1.1 to 6.2.1 [Alexis Svinartchouk] + +> ## etcher-sdk-6.2.1 +> ### (2021-03-26) +> +> +>
+> Update node-raspberrypi-usbboot from 0.2.11 to 0.3.0 [Alexis Svinartchouk] +> +>> ### node-raspberrypi-usbboot-0.3.0 +>> #### (2021-03-26) +>> +>> * Add support for compute module 4 [Alexis Svinartchouk] +>> * Fix size endianness of boot_message_t message [Alexis Svinartchouk] +>> +>
+> +> +> ## etcher-sdk-6.2.0 +> ### (2021-02-18) +> +> * Added BeagleBone USB Boot example [Parthiban Gandhi] +> * Added BeagleBone USB Boot support [Parthiban Gandhi] +> +
+ +* Fix getAppPath() returning an asar file on macOS [Alexis Svinartchouk] +* Grammar fix [Andrew Scheller] +* (docs) update README.md [vlad doster] +* Update copyright year in electron-builder.yml [Andrew Scheller] +* Update copyright year in .resinci.json [Andrew Scheller] +* Separate the Yum and DNF instructions. [Dugan Chen] +* Set msvs_version to 2019 when rebuilding [Alexis Svinartchouk] +* Use moduleIds: 'natural' in webpack config to keep js files in arm64 and x64 mac builds identical [Alexis Svinartchouk] +* Update electron-builder to 22.10.5 [Alexis Svinartchouk] +* Update spectron to v13 [Alexis Svinartchouk] +* Update dependencies, use aws4-axios@2.2.1 to avoid adding more dependiencies [Alexis Svinartchouk] +* Update scripts to build universal mac dmgs on the ci [Alexis Svinartchouk] +* Fix beforeBuild.js script to also work on mac [Alexis Svinartchouk] +* Support building universal dmgs (x64 and arm64) for mac [Alexis Svinartchouk] +* Update electron-builder to 22.10.4 [Alexis Svinartchouk] +* Fix titlebar z-index [Alexis Svinartchouk] +* Explicitly set contextIsolation to false [Alexis Svinartchouk] +* Update electron from 9.4.1 to 11.2.3 [Alexis Svinartchouk] + +
+ Update etcher-sdk from 6.1.0 to 6.1.1 [Alexis Svinartchouk] + +> ## etcher-sdk-6.1.1 +> ### (2021-02-10) +> +> +>
+> Update node-raspberrypi-usbboot from 0.2.10 to 0.2.11 [Alexis Svinartchouk] +> +>> ### node-raspberrypi-usbboot-0.2.11 +>> #### (2021-02-10) +>> +>> * Update @balena.io/usb from 1.3.12 to 1.3.14 [Alexis Svinartchouk] +>> +>
+> +> +
+ +# v1.5.116 +## (2021-02-03) + +* Only cleanup temporary decompressed files in child-writer [Alexis Svinartchouk] +* Add .versionbot/CHANGELOG.yml [Alexis Svinartchouk] +* Stop using node-tmp, use withTmpFile from etcher-sdk instead [Alexis Svinartchouk] + +
+ Update etcher-sdk from 5.2.2 to 6.1.0 [Alexis Svinartchouk] + +> ## etcher-sdk-6.1.0 +> ### (2021-02-03) +> +> * Prefix temporary decompressed images filenames [Alexis Svinartchouk] +> +> ## etcher-sdk-6.0.1 +> ### (2021-02-02) +> +> * Ignore ENOENT errors on unlink in withTmpFile [Alexis Svinartchouk] +> +> ## etcher-sdk-6.0.0 +> ### (2021-02-01) +> +> * Export tmp and add prefix and postfix options [Alexis Svinartchouk] +> +> ## etcher-sdk-5.2.3 +> ### (2021-01-26) +> +> * upgrade lint [Zane Hitchcox] +> +
+ +* Revert "Change some border colors to have higher contrast" [Alexis Svinartchouk] +* Update electron to v9.4.1 [Alexis Svinartchouk] + +
+ Update etcher-sdk from 5.2.1 to 5.2.2 [Alexis Svinartchouk] + +> ## etcher-sdk-5.2.2 +> ### (2021-01-19) +> +> +>
+> Update drivelist from 9.2.2 to 9.2.4 [Alexis Svinartchouk] +> +>> ### drivelist-9.2.4 +>> #### (2021-01-19) +>> +>> * Pass strings between methods as std::string instead of char * [Floris Bos] +>> +>> ### drivelist-9.2.3 +>> #### (2021-01-19) +>> +>> * Support lsblk versions that do no support the pttype column [Alexis Svinartchouk] +>> +>
+> +> +
+ +# v1.5.115 +## (2021-01-18) + + +
+ Update etcher-sdk from 5.1.12 to 5.2.1 [Alexis Svinartchouk] + +> ## etcher-sdk-5.2.1 +> ### (2021-01-15) +> +> * Only run one diskpart at a time [Alexis Svinartchouk] +> * Ignore diskpart VDS_E_DISK_IS_OFFLINE errors [Alexis Svinartchouk] +> +> ## etcher-sdk-5.2.0 +> ### (2021-01-06) +> +> * Store progress on usbboot devices [Alexis Svinartchouk] +> +
+ +# v1.5.114 +## (2021-01-12) + +* Remove libappindicator1 debian dependency [Alexis Svinartchouk] + +
+ Update etcher-sdk from 5.1.11 to 5.1.12 [Alexis Svinartchouk] + +> ## etcher-sdk-5.1.12 +> ### (2021-01-06) +> +> * Remove BlockDevice.mountpoints incorrect typing [Alexis Svinartchouk] +> * Update axios to 0.21.1 and aws4-axios to 2.0.1 [Alexis Svinartchouk] +> +
+ + +
+ Update rendition from 18.8.3 to 19.2.0 [Alexis Svinartchouk] + +> ## rendition-19.2.0 +> ### (2020-12-29) +> +> * Add truncate property to Txt component [JSReds] +> +> ## rendition-19.1.0 +> ### (2020-12-29) +> +> * Add fallback image source to Img component [Stevche Radevski] +> +> ## rendition-19.0.0 +> ### (2020-12-21) +> +> * Remove Arcslider component [Stevche Radevski] +> +> ## rendition-18.20.4 +> ### (2020-12-17) +> +> * Upgrade rehype-raw to latest version [Kakhaber] +> +> ## rendition-18.20.3 +> ### (2020-12-17) +> +> * Fix disabled button tooltip [JSReds] +> +> ## rendition-18.20.2 +> ### (2020-12-16) +> +> * Turn keydown handler into an arrow function [Stevche Radevski] +> +> ## rendition-18.20.1 +> ### (2020-12-14) +> +> * Fix form not getting the Enter key event when nested in a modal [Stevche Radevski] +> +> ## rendition-18.20.0 +> ### (2020-12-14) +> +> * feat: Add new StatsBar component [Graham McCulloch] +> +> ## rendition-18.19.2 +> ### (2020-12-14) +> +> * Update snapshots [Graham McCulloch] +> * Removed out-of-date documentation and template text [Graham McCulloch] +> +> ## rendition-18.19.1 +> ### (2020-12-04) +> +> * Markdown: Fix line breaks [Kakhaber] +> +> ## rendition-18.19.0 +> ### (2020-12-02) +> +> * Make card size responsive [Stevche Radevski] +> +> ## rendition-18.18.0 +> ### (2020-12-02) +> +> * Allow passing responsive values to datagrid width props [Stevche Radevski] +> +> ## rendition-18.17.2 +> ### (2020-12-01) +> +> * Update snapshots due to a Card change [JSReds] +> +> ## rendition-18.17.1 +> ### (2020-12-01) +> +> * Card: make body to be full height [JSReds] +> +> ## rendition-18.17.0 +> ### (2020-12-01) +> +> * Add star rating component [Kakhaber] +> +> ## rendition-18.16.0 +> ### (2020-11-23) +> +> * Completely revamp the development setup for rendition [Stevche Radevski] +> +> ## rendition-18.15.1 +> ### (2020-11-16) +> +> * Modal: Change the button margins to use the predefined spacing palette [Thodoris Greasidis] +> +> ## rendition-18.15.0 +> ### (2020-11-16) +> +> * Modal: Move the cancel button first for dangerous & warning actions [Thodoris Greasidis] +> +> ## rendition-18.14.0 +> ### (2020-11-16) +> +> * Allow passing checked items as a prop to Table [Stevche Radevski] +> +> ## rendition-18.13.4 +> ### (2020-11-16) +> +> * Fix accidental complete lodash import [Thodoris Greasidis] +> +> ## rendition-18.13.3 +> ### (2020-11-16) +> +> * Form: Remove the flaky Captcha sceenshot test [Thodoris Greasidis] +> * Update react-simplemde-editor & snapshots for upstream versions [Thodoris Greasidis] +> +> ## rendition-18.13.2 +> ### (2020-10-29) +> +> * Updated snapshots [Graham McCulloch] +> * Fix: Confirm only depends on the files it needs [Graham McCulloch] +> +> ## rendition-18.13.1 +> ### (2020-10-23) +> +> * Button: Preserve event during confirmation [Kakhaber] +> +> ## rendition-18.13.0 +> ### (2020-10-22) +> +> * Button: Add confirmation property [Kakhaber] +> +> ## rendition-18.12.2 +> ### (2020-10-21) +> +> * Tabs: changed interfaces and props [JSReds] +> +> ## rendition-18.12.1 +> ### (2020-10-20) +> +> * Fix Tabs typings [Stevche Radevski] +> +> ## rendition-18.12.0 +> ### (2020-10-19) +> +> * Add a Grid component [Stevche Radevski] +> +> ## rendition-18.11.3 +> ### (2020-10-14) +> +> * Added more documentation for JsonSchemaRenderer [Graham McCulloch] +> +> ## rendition-18.11.2 +> ### (2020-10-14) +> +> * fix: UI schema for JsonSchemaRenderer DropDownButton and ButtonGroup widgets [Graham McCulloch] +> +> ## rendition-18.11.1 +> ### (2020-10-13) +> +> * Add dark mode to storybook [Stevche Radevski] +> +> ## rendition-18.11.0 +> ### (2020-10-08) +> +> * Allow passing widget to extraFormats field [Stevche Radevski] +> +> ## rendition-18.10.2 +> ### (2020-09-30) +> +> * Resolve module path not relying on node_moules dir [Kakhaber] +> +> ## rendition-18.10.1 +> ### (2020-09-29) +> +> * Set tabpanel height so it stretches to full height [StefKors] +> * Specify tabs width to fix layout problems [StefKors] +> +> ## rendition-18.10.0 +> ### (2020-09-24) +> +> * feat: Add ColorWidget for JsonSchemaRenderer [Graham McCulloch] +> +> ## rendition-18.9.2 +> ### (2020-09-22) +> +> * Markdown: Ignore decorators inside a code block [Kakhaber] +> +> ## rendition-18.9.1 +> ### (2020-09-21) +> +> * Add compact variation to tabs [StefKors] +> +> ## rendition-18.9.0 +> ### (2020-09-18) +> +> * Improve spacing for Modal and Select components [Stevche Radevski] +> +> ## rendition-18.8.4 +> ### (2020-09-17) +> +> * fix: Use widget's display name to reference the widget [Graham McCulloch] +> +
+ +* Update dependencies [Alexis Svinartchouk] +* Update @balena/lint to 5.3.0 [Alexis Svinartchouk] +* Update webpack to v5 [Alexis Svinartchouk] +* Fix typo in webpack.config.ts comment [Alexis Svinartchouk] +* docs: fix quote marks [Aaron Shaw] +* Disable screensaver while flashing (on balena-electron-env) [Alexis Svinartchouk] + +# v1.5.113 +## (2020-12-16) + +* Show the first error for each drive (not the last) [Alexis Svinartchouk] +* Fix red leds not showing for failed devices [Alexis Svinartchouk] +* docs: add documentation links [Aaron Shaw] +* docs: update macOS version [Aaron Shaw] +* Improve hover message when the drive is too small [Alexis Svinartchouk] +* Update electron to v9.4.0 [Alexis Svinartchouk] +* Update npm to v6.14.8 [Giovanni Garufi] +* Update rgb leds colors [Alexis Svinartchouk] +* Remove unmountOnSuccess setting [Alexis Svinartchouk] +* Only show auto-updates setting on supported targets [Alexis Svinartchouk] +* Remove dead code in settings modal [Alexis Svinartchouk] +* Fix effective flashing speed calculation for compressed images [Alexis Svinartchouk] +* Change some border colors to have higher contrast [Lorenzo Alberto Maria Ambrosi] + +
+ Update etcher-sdk from 5.1.10 to 5.1.11 [Alexis Svinartchouk] + +> ## etcher-sdk-5.1.11 +> ### (2020-12-07) +> +> * Don't use the O_SYNC flag for block devices, only O_DIRECT [Alexis Svinartchouk] +> +
+ + +
+ Update sys-class-rgb-led from 2.1.1 to 3.0.0 [Alexis Svinartchouk] + +> ## sys-class-rgb-led-3.0.0 +> ### (2020-12-03) +> +> * Add example etcher-pro rainbow animation [Alexis Svinartchouk] +> * Use one setInterval instead of a loop for each led, t in seconds [Alexis Svinartchouk] +> +
+ +# v1.5.112 +## (2020-12-02) + +* Add rendition and sys-class-rgb-led to repo.yml [Alexis Svinartchouk] + +
+ Update sys-class-rgb-led from 2.1.0 to 2.1.1 [Alexis Svinartchouk] + +> ## sys-class-rgb-led-2.1.1 +> ### (2020-12-01) +> +> * Replace resin-lint with @balena/lint [Alexis Svinartchouk] +> * Update typescript to v4.1.2 [Alexis Svinartchouk] +> * Add versionbot changelog [Alexis Svinartchouk] +> +
+ +* Fix layout when the featured project is not showing [Alexis Svinartchouk] +* Improve flashing error handling [Alexis Svinartchouk] +* Fix modal content height on Windows [Alexis Svinartchouk] + +
+ Update etcher-sdk from 5.1.5 to 5.1.10 [Alexis Svinartchouk] + +> ## etcher-sdk-5.1.10 +> ### (2020-12-02) +> +> +>
+> Update balena-image-fs from 7.0.5 to 7.0.6 [Alexis Svinartchouk] +> +>> ### balena-image-fs-7.0.6 +>> #### (2020-12-02) +>> +>> +>>
+>> Update ext2fs from 3.0.4 to 3.0.5 [Alexis Svinartchouk] +>> +>>> #### node-ext2fs-3.0.5 +>>> ##### (2020-12-02) +>>> +>>> * Fix reading and discarding with offsets > 32 bits [Alexis Svinartchouk] +>>> +>>
+>> +>> +>
+> +> +> ## etcher-sdk-5.1.9 +> ### (2020-12-01) +> +> * Add repo.yml file [Alexis Svinartchouk] +> * Update @balena/udif from 1.1.0 to 1.1.1 [Alexis Svinartchouk] +> +>
+> Update zip-part-stream from 1.0.2 to 1.0.3 [Alexis Svinartchouk] +> +>> ### zip-part-stream-1.0.3 +>> #### (2020-11-30) +>> +>> * Add versionbot changelog [Alexis Svinartchouk] +>> +>
+> +> +>
+> Update node-raspberrypi-usbboot from 0.2.9 to 0.2.10 [Alexis Svinartchouk] +> +>> ### node-raspberrypi-usbboot-0.2.10 +>> #### (2020-11-30) +>> +>> * Update typescript to v4.1.2 [Alexis Svinartchouk] +>> * Add versionbot changelog [Alexis Svinartchouk] +>> +>
+> +> +>
+> Update mountutils from 1.3.19 to 1.3.20 [Alexis Svinartchouk] +> +>> ### mountutils-1.3.20 +>> #### (2020-11-30) +>> +>> * Add versionbot changelog [Alexis Svinartchouk] +>> +>
+> +> +>
+> Update gzip-stream from 1.1.1 to 1.1.2 [Alexis Svinartchouk] +> +>> ### gzip-stream-1.1.2 +>> #### (2020-11-30) +>> +>> * Add versionbot changelog [Alexis Svinartchouk] +>> +>
+> +> +>
+> Update drivelist from 9.2.1 to 9.2.2 [Alexis Svinartchouk] +> +>> ### drivelist-9.2.2 +>> #### (2020-11-30) +>> +>> * Update typescript to v4.1.2 [Alexis Svinartchouk] +>> * Add versionbot changelog [Alexis Svinartchouk] +>> +>
+> +> +>
+> Update blockmap from 4.0.2 to 4.0.3 [Alexis Svinartchouk] +> +>> ### blockmap-4.0.3 +>> #### (2020-11-30) +>> +>> * Update typescript to v4.1.2 [Alexis Svinartchouk] +>> * Add versionbot changelog [Alexis Svinartchouk] +>> +>
+> +> +>
+> Update partitioninfo from 6.0.1 to 6.0.2 [Alexis Svinartchouk] +> +>> ### partitioninfo-6.0.2 +>> #### (2020-11-27) +>> +>> +>>
+>> Update file-disk from 8.0.0 to 8.0.1 [Alexis Svinartchouk] +>> +>>> #### file-disk-8.0.1 +>>> ##### (2020-11-26) +>>> +>>> * Add versionbot changelog [Alexis Svinartchouk] +>>> +>>
+>> +>> * Add versionbot changelog [Alexis Svinartchouk] +>> +>
+> +> +>
+> Update file-disk from 8.0.0 to 8.0.1 [Alexis Svinartchouk] +> +>> ### file-disk-8.0.1 +>> #### (2020-11-26) +>> +>> * Add versionbot changelog [Alexis Svinartchouk] +>> +>> ### file-disk-8.0.1 +>> #### (2020-11-26) +>> +>> * Add versionbot changelog [Alexis Svinartchouk] +>> +>
+> +> +>
+> Update balena-image-fs from 7.0.4 to 7.0.5 [Alexis Svinartchouk] +> +>> ### balena-image-fs-7.0.5 +>> #### (2020-11-27) +>> +>> +>>
+>> Update file-disk from 8.0.0 to 8.0.1 [Alexis Svinartchouk] +>> +>>> #### file-disk-8.0.1 +>>> ##### (2020-11-26) +>>> +>>> * Add versionbot changelog [Alexis Svinartchouk] +>>> +>>
+>> +>> +>>
+>> Update ext2fs from 3.0.3 to 3.0.4 [Alexis Svinartchouk] +>> +>>> #### node-ext2fs-3.0.4 +>>> ##### (2020-11-26) +>>> +>>> * Add versionbot changelog [Alexis Svinartchouk] +>>> +>>
+>> +>> +>>
+>> Update partitioninfo from 6.0.1 to 6.0.2 [Alexis Svinartchouk] +>> +>>> #### partitioninfo-6.0.2 +>>> ##### (2020-11-27) +>>> +>>> +>>>
+>>> Update file-disk from 8.0.0 to 8.0.1 [Alexis Svinartchouk] +>>> +>>>> ##### file-disk-8.0.1 +>>>> ###### (2020-11-26) +>>>> +>>>> * Add versionbot changelog [Alexis Svinartchouk] +>>>> +>>>
+>>> +>>> * Add versionbot changelog [Alexis Svinartchouk] +>>> +>>
+>> +>> * Add versionbot changelog [Alexis Svinartchouk] +>> +>
+> +> +> ## etcher-sdk-5.1.8 +> ### (2020-11-26) +> +> * Add versionbot changelog [Alexis Svinartchouk] +> +> ## etcher-sdk-5.1.7 +> ### (2020-11-25) +> +> * Don't start opening drives in advance to avoid unhandled rejections [Alexis Svinartchouk] +> * Update generated docs [Alexis Svinartchouk] +> +> ## etcher-sdk-5.1.6 +> ### (2020-11-24) +> +> * Do not unmount source drives [Alexis Svinartchouk] +> * Factorize retrying transient errors [Alexis Svinartchouk] +> * Retry opening files & block devices on transient errors [Alexis Svinartchouk] +> * Update generated docs [Alexis Svinartchouk] +> +
+ +* Set useContentSize to true so the size is the same on all platforms [Alexis Svinartchouk] + +# v1.5.111 +## (2020-11-23) + +* Warn when the source drive has no partition table [Alexis Svinartchouk] +* Use a different icon when no source drive is available [Alexis Svinartchouk] +* Allow selecting a locked SD card as the source drive [Alexis Svinartchouk] +* Remove "Validate write on success" setting. Validation is always enabled, press the "skip" button to skip it. [Alexis Svinartchouk] +* Update electron to v9.3.3 [Alexis Svinartchouk] +* Update etcher-sdk to 5.1.1, use WASM ext2fs module [Alexis Svinartchouk] + +# v1.5.110 +## (2020-11-04) + +* Remove console.log in tests [Lorenzo Alberto Maria Ambrosi] +* Fix URL not being selected with custom protocol [Lorenzo Alberto Maria Ambrosi] +* Add skip function to validation [Lorenzo Alberto Maria Ambrosi] +* Rework success screen [Lorenzo Alberto Maria Ambrosi] + +# v1.5.109 +## (2020-09-14) + +* Workaround elevation bug on Windows when the username contains an ampersand [Alexis Svinartchouk] + +# v1.5.108 +## (2020-09-10) + +* Fix content not loading when the app path contains special characters [Alexis Svinartchouk] + +# v1.5.107 +## (2020-09-04) + +* Re-enable ext partitions trimming on 32 bit Windows [Alexis Svinartchouk] +* Rework system & large drives handling logic [Lorenzo Alberto Maria Ambrosi] +* Reword macOS Catalina askpass message [Lorenzo Alberto Maria Ambrosi] +* Add clone-drive workflow [Lorenzo Alberto Maria Ambrosi] + +# v1.5.106 +## (2020-08-27) + +* Disable ext partitions trimming on 32 bit windows until it is fixed [Alexis Svinartchouk] +* Fix opening zip files from servers accepting Range headers [Alexis Svinartchouk] + +# v1.5.105 +## (2020-08-25) + +* Update etcher-sdk to 4.1.26 [Alexis Svinartchouk] +* URL selector cancel button cancels ongoing url selection [Alexis Svinartchouk] +* Spinner for URL selector modal [Alexis Svinartchouk] + +# v1.5.104 +## (2020-08-20) + +* Fix writing config file [Alexis Svinartchouk] +* Update electron to v9.2.1 [Alexis Svinartchouk] + +# v1.5.103 +## (2020-08-18) + +* Update rendition to ^17 [Alexis Svinartchouk] +* Update electron to 9.2.0 [Alexis Svinartchouk] +* Update etcher-sdk to ^4.1.23 [Alexis Svinartchouk] +* Move linting and testing into package.json [Alexis Svinartchouk] +* Set module: es2015 in tsconfig.json [Alexis Svinartchouk] +* Replace native elevator with sudo-prompt on windows [Alexis Svinartchouk] +* Don't import WeakMap polyfill in deep-map-keys [Alexis Svinartchouk] +* Don't use lodash in child-writer.js [Alexis Svinartchouk] +* Optimize svgs [Alexis Svinartchouk] +* User regular stream in lzma-native instead of readable-stream [Alexis Svinartchouk] +* Remove Bluebird [Alexis Svinartchouk] + +# v1.5.102 +## (2020-07-27) + +* Fix flashing truncated images, fix flashing large dmgs [Alexis Svinartchouk] +* Electron 9.1.1 [Alexis Svinartchouk] +* Remove bluebird from main process, reduce lodash usage [Alexis Svinartchouk] +* Centralize imports in child-writer [Alexis Svinartchouk] +* Split main process and child-writer js files [Alexis Svinartchouk] +* Stop using request, replace it with already used axios [Alexis Svinartchouk] +* Remove font awesome unused icons from the generated bundle [Alexis Svinartchouk] +* Remove no longer used .sass-lint.yml [Alexis Svinartchouk] +* Use tslib [Alexis Svinartchouk] +* Use strict typescript compiler option [Alexis Svinartchouk] +* Update rendition to ^16.1.1 [Alexis Svinartchouk] + +# v1.5.101 +## (2020-07-09) + +* Resize modal to show content appropriately [Lorenzo Alberto Maria Ambrosi] +* Update etcher-sdk to v4.1.16 [Lorenzo Alberto Maria Ambrosi] +* Convert sass to plain css [Lorenzo Alberto Maria Ambrosi] +* Remove unused scss [Lorenzo Alberto Maria Ambrosi] +* Remove unused warning in settings [Lorenzo Alberto Maria Ambrosi] +* Refactor UI without bootstrap & flexboxgrid [Lorenzo Alberto Maria Ambrosi] +* Restyle modals [Lorenzo Alberto Maria Ambrosi] +* Remove bootstrap & flexboxgrid [Lorenzo Alberto Maria Ambrosi] +* Rework and move flashing view elements [Lorenzo Alberto Maria Ambrosi] +* Refactor UI grid to use rendition [Lorenzo Alberto Maria Ambrosi] + +# v1.5.100 +## (2020-06-22) + +* Update partitioninfo to 5.3.5 [Alexis Svinartchouk] +* Add .vhd to the list of supported extensions, allow opening any file [Alexis Svinartchouk] +* Update mocha to v8.0.1 [Alexis Svinartchouk] +* Update electron-notarize to v1.0.0 [Alexis Svinartchouk] +* Update electron to v9.0.4 [Alexis Svinartchouk] +* Update etcher-sdk to v4.1.15 [Alexis Svinartchouk] +* Sticky header in target selection table [Alexis Svinartchouk] +* Update rendition to 15.2.1 [Alexis Svinartchouk] +* Fix source-selector image height [Lorenzo Alberto Maria Ambrosi] +* Update rendition to v15.0.0 [Lorenzo Alberto Maria Ambrosi] +* Merge unsafe mode with new target selector [Lorenzo Alberto Maria Ambrosi] +* Rework target selector modal [Lorenzo Alberto Maria Ambrosi] + +# v1.5.99 +## (2020-06-12) + +* Update node-raspberrypi-usbboot to 0.2.8 [Alexis Svinartchouk] +* Update electron to 9.0.3 [Alexis Svinartchouk] +* Inline all svgs [Alexis Svinartchouk] + +# v1.5.98 +## (2020-06-10) + +* Use between 2 and 256MiB for buffering depending on the number of drives [Alexis Svinartchouk] +* Check that argument is an url or a regular file before opening [Alexis Svinartchouk] +* Update etcher-sdk to ^4.1.13 [Alexis Svinartchouk] + +# v1.5.97 +## (2020-06-08) + +* Update electron to v9.0.2 [Alexis Svinartchouk] +* Fix flash from url on windows [Alexis Svinartchouk] +* Avoid random access in http sources [Alexis Svinartchouk] +* Update etcher-sdk to ^4.1.8 [Alexis Svinartchouk] +* Read image path from arguments, register `etcher://...` protocol [Alexis Svinartchouk] +* Update etcher-sdk to ^4.1.6 [Alexis Svinartchouk] +* Fix sudo-prompt promisification [Alexis Svinartchouk] +* Allow skipping notarization when building package (dev) [Lorenzo Alberto Maria Ambrosi] + +# v1.5.96 +## (2020-06-03) + +* Fix ia32 builds for windows [Alexis Svinartchouk] +* Remove writing speed from finish screen [Alexis Svinartchouk] +* Add effective speed in flash results [Alexis Svinartchouk] +* Update progress bar style [Alexis Svinartchouk] +* Change font to SourceSansPro and fix hover color [Alexis Svinartchouk] +* Update rendition to ^14.13.0 [Alexis Svinartchouk] +* Remove unused styles [Alexis Svinartchouk] + +# v1.5.95 +## (2020-06-01) + +* spectron: Make tests pass on Windows Docker containers [Juan Cruz Viotti] + +# v1.5.94 +## (2020-05-27) + +* Stop checking file extensions [Alexis Svinartchouk] +* Fix flash from url (broken in 1.5.92) [Alexis Svinartchouk] +* Update etcher-sdk to ^4.1.4 [Alexis Svinartchouk] + +# v1.5.93 +## (2020-05-25) + +* Update electron-builder to v22.6.1 [Alexis Svinartchouk] +* Strip out comments from generated code [Alexis Svinartchouk] +* Update electron to v9.0.0 [Alexis Svinartchouk] + +# v1.5.92 +## (2020-05-22) + +* Use electron.app.getAppPath() instead of reading it from argv in catalina-sudo [Alexis Svinartchouk] +* Disable asar packing on all platforms [Alexis Svinartchouk] +* Remove unneeded fortawesome from main.scss [Alexis Svinartchouk] +* Remove unneeded font formats [Alexis Svinartchouk] +* Webpack everything, reduce package size [Alexis Svinartchouk] + +# v1.5.91 +## (2020-05-21) + +* Minor fix - Init isSourceDrive param in correct place [Lorenzo Alberto Maria Ambrosi] +* Fix undefined image from DriveCompatibilityWarning [Rob Evans] + +# v1.5.90 +## (2020-05-20) + +* Update leds behaviour [Alexis Svinartchouk] + +# v1.5.89 +## (2020-05-13) + +* Fix drive selector modal padding [Alexis Svinartchouk] +* Update all dependencies minor versions [Alexis Svinartchouk] +* Update @types/node 12.12.24 -> 12.12.39 [Alexis Svinartchouk] +* Update ts-loader 6 -> 7 [Alexis Svinartchouk] +* Update sinon 8 -> 9 [Alexis Svinartchouk] +* Update node-gyp 3 -> 6 [Alexis Svinartchouk] +* Update lint-staged 9 -> 10 [Alexis Svinartchouk] +* Update husky 3 -> 4 [Alexis Svinartchouk] +* Remove no longer used html-loader dev dependency [Alexis Svinartchouk] +* Update electron-notarize 0.1.1 -> 0.3.0 [Alexis Svinartchouk] +* Remove no longer used chalk dev dependency [Alexis Svinartchouk] +* Update @types/tmp 0.1.0 -> 0.2.0 [Alexis Svinartchouk] +* Update @types/sinon 7 -> 9 [Alexis Svinartchouk] +* Update @types/semver 6 -> 7 [Alexis Svinartchouk] +* Update @types/mocha 5 -> 7 [Alexis Svinartchouk] + +# v1.5.88 +## (2020-05-12) + +* Update roboto-fontface 0.9.0 -> 0.10.0 [Alexis Svinartchouk] +* Update rendition 12 -> 14, styled-system and styled-components 4 -> 5 [Alexis Svinartchouk] +* Update electron-updater 4.0.6 -> 4.3.1 [Alexis Svinartchouk] +* Update redux 3 -> 4 [Alexis Svinartchouk] +* Update debug 3 -> 4 [Alexis Svinartchouk] +* Update semver 5 -> 7 [Alexis Svinartchouk] +* Update tmp 0.1.0 -> 0.2.1 [Alexis Svinartchouk] +* Update uuid v3 -> v8 [Alexis Svinartchouk] + +# v1.5.87 +## (2020-05-12) + +* Update etcher-sdk to ^4.1.3 to fix issues with some bz2 files [Alexis Svinartchouk] + +# v1.5.86 +## (2020-05-06) + +* Fix theme warnings [Alexis Svinartchouk] + +# v1.5.85 +## (2020-05-05) + +* Prefer balena-etcher to etcher-bin on Arch Linux [Alexis Svinartchouk] + +# v1.5.84 +## (2020-05-04) + +* Including Arch / Manjaro install instructions [Tom] +* Fix notification icon path [Alexis Svinartchouk] + +# v1.5.83 +## (2020-04-30) + +* Decompress images before flashing, remove trim setting, trim ext partitions [Alexis Svinartchouk] + +# v1.5.82 +## (2020-04-24) + +* Allow http/https only for Flash from URL [Lorenzo Alberto Maria Ambrosi] +* Add generic error's message [Lorenzo Alberto Maria Ambrosi] +* Refactor buttons style [Lorenzo Alberto Maria Ambrosi] +* Add flash from url workflow [Lorenzo Alberto Maria Ambrosi] +* Add staging percentage for v1.5.81 [Lorenzo Alberto Maria Ambrosi] +* Trigger update for v1.5.81 [Lorenzo Alberto Maria Ambrosi] + +# v1.5.81 +## (2020-04-14) + +* Add average speed in flash results [Lorenzo Alberto Maria Ambrosi] +* docs: Update macOS drive recovery command [Wilson de Farias] +* Update etcher-sdk to use direct IO [Alexis Svinartchouk] + +# v1.5.80 +## (2020-03-24) + +* Use zoomFactor to scale contents in fullscreen mode [Lorenzo Alberto Maria Ambrosi] +* Update electron to v7.1.14 [Alexis Svinartchouk] +* Fix sass files path for lint-sass [Alexis Svinartchouk] + +# v1.5.79 +## (2020-02-20) + +* Remove "Download the React DevTools for a better development experience" message [Alexis Svinartchouk] +* Fix error when launching from terminal when installed via apt. [Alois Klink] + +# v1.5.78 +## (2020-02-19) + +* Update drivelist to 8.0.10 to fix parsing lsblk --pairs [Alexis Svinartchouk] + +# v1.5.77 +## (2020-02-17) + +* Fix error message not being shown on write error [Alexis Svinartchouk] +* The RGBLed module has been moved to a separate repository [Alexis Svinartchouk] + +# v1.5.76 +## (2020-02-05) + +* Prefix temp permissions script name [Lorenzo Alberto Maria Ambrosi] +* Fix image drop zone, remove react-dropzone dependency [Alexis Svinartchouk] +* Update etcher-sdk to ^2.0.17 [Alexis Svinartchouk] + +# v1.5.75 +## (2020-02-05) + +* Initialize leds object map [Omar López] + +# v1.5.74 +## (2020-02-04) + +* Etcher pro leds feature [Alexis Svinartchouk] +* Compress deb package with bzip instead of xz [Alexis Svinartchouk] +* Update electron to 7.1.11 [Alexis Svinartchouk] +* Sort devices by device path on Linux [Alexis Svinartchouk] + +# v1.5.73 +## (2020-01-28) + +* Update electron to v7.1.10 [Alexis Svinartchouk] + +# v1.5.72 +## (2020-01-27) + +* Remove no longer used angular svg-icon component [Alexis Svinartchouk] +* Remove no longer used closestUnit angular filter [Alexis Svinartchouk] + +# v1.5.71 +## (2020-01-14) + +* Update resin-corvus to 2.0.5 [Lorenzo Alberto Maria Ambrosi] + +# v1.5.70 +## (2019-12-13) + +* Make header draggable again [Lorenzo Alberto Maria Ambrosi] +* Refactor drive selector and confirm modal to React [Lorenzo Alberto Maria Ambrosi] +* Rework lib/gui/app/styled-components to typescript [Alexis Svinartchouk] +* Convert FlashAnother & FlashResults to typescript [Lorenzo Alberto Maria Ambrosi] +* Use React instead of Angular for image selection [Lucian] +* Convert the drive selection step to React [Thodoris Greasidis] +* chore: move flash step to React [Stevche Radevski] +* Use React instead of Angular for image selection [Lucian] + +# v1.5.69 +## (2019-12-10) + +* Don't add --no-sandbox when ELECTRON_RUN_AS_NODE true [Alexis Svinartchouk] + +# v1.5.68 +## (2019-12-08) + +* Add version in settings modal [Lorenzo Alberto Maria Ambrosi] + +# v1.5.67 +## (2019-12-06) + +* Fix elevation on macos in development [Alexis Svinartchouk] + +# v1.5.66 +## (2019-12-03) + +* Update spectron to ^8 [Alexis Svinartchouk] +* Update dependencies, get node-usb from npm [Alexis Svinartchouk] +* Update nan to ^2.14 [Alexis Svinartchouk] +* Use the same entrypoint for etcher and the child writer [Alexis Svinartchouk] +* Require angular-mocks only when needed [Alexis Svinartchouk] +* Remove no longer needed pkg dev dependency [Alexis Svinartchouk] +* Update mocha, remove nock [Alexis Svinartchouk] +* Remove no longer needed xml2js [Alexis Svinartchouk] +* Remove node-pre-gyp patch that is no longer needed with electron 6 [Alexis Svinartchouk] +* Update electron-mocha to ^8.1.2, remove acorn [Alexis Svinartchouk] +* Update electron to 6.0.10 [Alexis Svinartchouk] + +# v1.5.65 +## (2019-12-02) + +* Convert settings modal to typescript [Lorenzo Alberto Maria Ambrosi] +* Refactor settings page into modal [Lorenzo Alberto Maria Ambrosi] + +# v1.5.64 +## (2019-11-22) + +* Use bash instead of sh for running the elevated process on Linux and Mac [Alexis Svinartchouk] + +# v1.5.63 +## (2019-11-08) + +* Introduce an FAQ file [Dimitrios Lytras] + +# v1.5.62 +## (2019-11-06) + +* Update drivelist to 8.0.9 [Alexis Svinartchouk] + +# v1.5.61 +## (2019-11-05) + +* Notarize app on macOS [Lorenzo Alberto Maria Ambrosi] + +# v1.5.60 +## (2019-10-18) + +* Upgrade ext2fs to 1.0.30 [Matthew McGinn] + +# v1.5.59 +## (2019-10-14) + +* Catch console log messages from SafeWebView [Roman Mazur] + +# v1.5.58 +## (2019-10-10) + +* Remove leftover GH-pages configuration file [Dimitrios Lytras] + +# v1.5.57 +## (2019-09-16) + +* Fix entrypoint when options are passed to electron [Alexis Svinartchouk] + +# v1.5.56 +## (2019-08-20) + +* Fix windows portable download [Lorenzo Alberto Maria Ambrosi] + +# v1.5.55 +## (2019-08-19) + +* Update etcher-sdk to ^2.0.13 [Alexis Svinartchouk] + +# v1.5.54 +## (2019-08-07) + +* Fix auto-updater check for updates [Lorenzo Alberto Maria Ambrosi] + +# v1.5.53 +## (2019-08-06) + +* Allow typescript files [Lorenzo Alberto Maria Ambrosi] + +# v1.5.52 +## (2019-07-22) + +* Don't use wmic's ProviderName if it's empty [Alexis Svinartchouk] + +# v1.5.51 +## (2019-06-28) + +* Update sudo-prompt to ^9.0.0 [Alexis Svinartchouk] + +# v1.5.50 +## (2019-06-13) + +* Option for trimming ext partitions on raw images [Alexis Svinartchouk] + +# v1.5.49 +## (2019-06-13) + +* Make window size configurable [Alexis Svinartchouk] + +# v1.5.48 +## (2019-06-13) + +* Don't use sudo-prompt when already elevated [Alexis Svinartchouk] + +# v1.5.47 +## (2019-06-10) + +* Rework drive-selector with react + rendition [Lorenzo Alberto Maria Ambrosi] +* Use rendition theme property for step buttons [Lorenzo Alberto Maria Ambrosi] +* Upgrade styled-system to v4.1.0 [Lorenzo Alberto Maria Ambrosi] +* Upgrade rendition to v8.7.2 [Lorenzo Alberto Maria Ambrosi] + +# v1.5.46 +## (2019-06-09) + +* Update ext2fs to 1.0.29 [Alexis Svinartchouk] + +# v1.5.45 +## (2019-06-04) + +* Empty commit to trigger build [Alexis Svinartchouk] + +# v1.5.44 +## (2019-06-03) + +* Fix elevation on windows when the path contains "&" or "'" [Alexis Svinartchouk] + +# v1.5.43 +## (2019-05-28) + +* Revert "Include sass in webpack configs" [Lorenzo Alberto Maria Ambrosi] + +# v1.5.42 +## (2019-05-28) + +* Include sass in webpack configs [Lorenzo Alberto Maria Ambrosi] + +# v1.5.41 +## (2019-05-27) + +* waffle.io removal and adding a link to the license [Mateusz Hajder] + +# v1.5.40 +## (2019-05-24) + +* windows installer and portable version support both ia32 and x64 [Alexis Svinartchouk] + +# v1.5.39 +## (2019-05-14) + +* Add clean-shrinkwrap script to postshrinkwrap step [Lorenzo Alberto Maria Ambrosi] + +# v1.5.38 +## (2019-05-13) + +* Add mention to usbboot compatibility [Carlo Maria Curinga] + +# v1.5.37 +## (2019-05-13) + +* Bump react dependency to v16.8.5 [Lorenzo Alberto Maria Ambrosi] + +# v1.5.36 +## (2019-05-13) + +* Update etcher-sdk to ^2.0.9 [Alexis Svinartchouk] + +# v1.5.35 +## (2019-05-10) + +* Downgrade electron 4.1.5 -> 3.1.9 [Alexis Svinartchouk] + +# v1.5.34 +## (2019-05-09) + +* Use https url for fetching config, avoid redirection [Alexis Svinartchouk] +* win32: fix running diskpart when the tmp file path contains spaces [Alexis Svinartchouk] + +# v1.5.33 +## (2019-04-30) + +* Fix gzipped files verification percentage and dmg verification. [Alexis Svinartchouk] + +# v1.5.32 +## (2019-04-30) + +* Export NPM_VERSION variable in Makefile [Lorenzo Alberto Maria Ambrosi] + +# v1.5.31 +## (2019-04-29) + +* Update etcher-sdk to ^2.0.3 [Alexis Svinartchouk] +* Update electron to 4.1.5 [Alexis Svinartchouk] + +# v1.5.30 +## (2019-04-24) + +* Don't show a dialog when the write fails. [Alexis Svinartchouk] + +# v1.5.29 +## (2019-04-19) + +* Add support for auto-updating feature [Giovanni Garufi] + +# v1.5.28 +## (2019-04-18) + +* Update electron-builder to ^20.40.2 [Alexis Svinartchouk] +* Update etcher-sdk to ^2.0.1 [Alexis Svinartchouk] + +# v1.5.27 +## (2019-04-16) + +* (Windows): Fix reading images from network drives when the tmp dir has spaces [Alexis Svinartchouk] + +# v1.5.26 +## (2019-04-12) + +* (Windows): Fix reading images from network drives containing non ascii characters [Alexis Svinartchouk] + +# v1.5.25 +## (2019-04-09) + +* New parameter in webview for opt-out analytics [Lorenzo Alberto Maria Ambrosi] + +# v1.5.24 +## (2019-04-05) + +* Update resin-corvus to ^2.0.3 [Alexis Svinartchouk] + +# v1.5.23 +## (2019-04-03) + +* Configure versionbot to publish repo metadata to github pages [Giovanni Garufi] + +# v1.5.22 +## (2019-04-02) + +* (Windows): Use full path to wmic as some systems don't have it in their PATH [Alexis Svinartchouk] + +# v1.5.21 +## (2019-04-02) + +* Fix error when config.analytics was undefined [Alexis Svinartchouk] + +# v1.5.20 +## (2019-04-01) + +* Don't try to flash when no device is selected [Alexis Svinartchouk] +* Reformat changelog [Giovanni Garufi] +* Avoid "Error: There is already a flash in progress" errors [Alexis Svinartchouk] + +# v1.5.19 +## (2019-03-28) + +* Update resin-corvus to ^2.0.2 [Alexis Svinartchouk] +* Better reporting of unhandled rejections to sentry [Alexis Svinartchouk] + +# v1.5.18 +## (2019-03-26) + +* Update build scripts [Giovanni Garufi] + +## v1.5.17 - 2019-03-25 + +### Misc + +- Automatically publish github release from CI + +## v1.5.16 - 2019-03-25 + +### Misc + +- Add repo.yml + +## v1.5.15 - 2019-03-20 + +### Misc + +- Show the correct logo on usbboot devices on Ubuntu + +## v1.5.14 - 2019-03-20 + +### Misc + +- Update etcher-sdk to ^1.3.10 + +## v1.5.13 - 2019-03-18 + +### Misc + +- Update build scripts + +## v1.5.12 - 2019-03-15 + +### Misc + +- Update build scripts + +## v1.5.11 - 2019-03-12 + +### Misc + +- Fixed broken Hombrew cask link for etcher +- Remove no longer used travis and appveyor configs + +## v1.5.10 - 2019-03-12 + +### Misc + +- Update resin-scripts + +## v1.5.9 - 2019-03-05 + +### Misc + +- Update etcher-sdk to 1.3.0 + +## v1.5.8 - 2019-03-01 + +### Misc + +- Update ext2fs to 1.0.27 + +## v1.5.7 - 2019-03-01 + +### Fixes + +- Update docs +- Fix disappearing modal window + +### Misc + +- Fix blurred background image + +## v1.5.6 - 2019-02-28 + +### Misc + +- Target electron 3 runtime in babel options + +## v1.5.5 - 2019-02-28 + +### Misc + +- Don't pass undefined sockets to ipc.server.emit() +- Fix error when event.dataTransfer.files is empty +- Fix error message not showing when an unsupported image is selected +- Avoid `Invalid percentage` exceptions +- Update etcher-sdk to 1.1.0 + +## v1.5.4 - 2019-02-27 + +### Misc + +- Add missing step for submodule cloning in README + +## v1.5.3 - 2019-02-27 + +### Misc + +- Throw error if no commit is annotated with a changelog entry + +## v1.5.2 - 2019-02-26 + +- Enable versionist editVersion + +## v1.5.1 - 2019-02-22 + +### Misc + +- Removed lodash dependency in versionist.conf.js + +## v1.5.0 - 2019-02-16 + +### Misc + +- Reworked flashing logic with etcher-sdk +- Add support for flashing Raspberry Pi CM3+ +- Upgrade to Electron v3. +- Upgrade to NPM 6.7.0 +- Fix incorrect drives list on Linux +- Changed “Drive Contains Image” to “Drive Mountpoint Contains Image” +- Removed etcher-cli + +## v1.4.9 - 2018-12-19 + +### Fixes + +- Fix update notifier error popping up on v1.4.1->1.4.8 + +### Misc + +- Added React component for the Flash Results button +- Added React component for the Flash Another button +- Restyle success screen and enlarge UI elements +- Use https for fetching sub modules +- Add `.wic` image extension as supported format + +## v1.4.8 - 2018-11-23 + +### Features + +- Added featured-project while flashing + +### Fixes + +- Moved back the write cancel button +- Reject drives with null size (fixes pretty-bytes error) + +## v1.4.7 - 2018-11-12 + +### Fixes + +- Fix typo in contributing guidelines +- Modify versionist.conf.js to match new internal commit guidelines + +### Misc + +- Rename etcher to balena-etcher +- Convert Select Image button to Rendition + +## v1.4.6 - 2018-10-28 + +### Fixes + +- Provide a Buffer to xxhash.Stream +- Fix 64 bit detection on arm +- Fix incorrect file constraint path +- Fix flash cancel button interaction + +### Misc + +- Add new balena.io logos +- Use Resin CI scripts to build Etcher +- Enable React lint rules +- Convert Progress Button to Rendition + +## v1.4.5 - 2018-10-11 + +### Features + +- Center content independent to window resolution. +- Add electron-native file-picker component. +- Hide unsafe mode option toggle with an env var. +- Use new design background color and drive step size ordering. +- Add a convenience Storage class on top of localStorage. +- Introduce env var to toggle autoselection of all drives. +- Add font-awesome. +- Add support for configuration files +- Use GTK-3 darkTheme mode. +- Add environment variable to toggle fullscreen. +- Allow blacklisting of drives through and environment variable ETCHER_BLACKLISTED_DRIVES. +- Show selected drives below drive selection step. +- Add a button to cancel the flash process. +- Download usbboot drivers installer when clicking a driverless usbboot device on Windows. +- Allow disabling links and hiding help link with an env var. + +### Fixes + +- Add "make webpack" to travis-ci build script +- Makefile: Don't use tilde in rpm versions +- Change Spectron port so not to overlap with other builds +- Fix multi-writes analytics by reusing existing logic in multi-write events. +- Load usbboot adapter on start on GNU/Linux if running as root. + +### Misc + +- Update drivelist to v6.4.2 +- Add instructions for installing and uninstalling on Solus. + +## v1.4.4 - 2018-04-24 + +### Fixes + +- Don't display status dots with a quantity of zero on success screen +- Correct wording of flash status to use "successful" instead of "succeeded" +- Keep single drive-image pairs with warnings selected + +### Misc + +- Improve notification messages + +## v1.4.3 - 2018-04-19 + +### Fixes + +- Fix blob handling for usbboot + +## v1.4.2 - 2018-04-18 + +### Features + +- Make the progress button blue on verification +- Display succeeded and failed devices on finish screen + +### Fixes + +- Exclude RAID devices from drive selection list +- Display untitled device when device lacks description +- Prefix multiple devices label with quantity +- Fix handling of errors over IPC +- Fix usbboot blob loading +- Revert using native binding to clean disks on Windows + +## v1.4.1 - 2018-04-10 + +### Fixes + +- Exclude package.json from UI bundle + +## v1.4.0 - 2018-04-05 + +### Features + +- Move the drive selector warning dialog to the flash step +- Display image size for comparison if drive is too small +- Implement writing to multiple destinations simultaneously +- Add colorised multi-writes progress status dots +- Move CLI write preparation logic into SDK +- Make the drive-selector button orange on warnings +- Warn the user on selection of large drives +- Consolidate low-level components into Etcher SDK +- Use native code to clean drives on Windows +- Increase UV_THREADPOOL_SIZE to allocate 4 threads per CPU +- Add icon next to drive size when compatibility warnings exist +- Display number of active devices while flashing in CLI +- Replace CRC32 checksums with SHA512 +- Enable usbboot on Linux if run as root + +### Fixes + +- Improve spacing to the drive-selector warning/error labels +- Line wrap selector size subtitles wholly +- Hide the size label given multiple devices +- Use correct usbboot blob path in AppImages +- Fix EINVAL error on Linux +- Fix enabling debug output +- Fix DevTools opening in docked mode +- Fix menu's application name +- Fix "Array buffer allocation failed" when flashing some .dmg images +- Log the banner load event to analytics +- Warn on usbboot load error in the console on Linux +- Ensure image/drive size is displayed on new line +- Don't force-inherit process environment on Windows + +### Misc + +- Replace Helvetica as the main font with Roboto +- Update Electron to v1.7.13 +- Add spacing to the drive warning icon +- Use multi-drive methods with drive-list warning button +- Remove unused & deprecated robot protocol +- Update copyright years +- Update instructions in ISSUE_TEMPLATE +- Use Concourse CI for automated release builds +- Only publish production packages to Bintray (remove devel) +- Replace Gitter with Resin.io Forums for support +- Add support for arm64 / armv8 / aarch64 in build scripts +- Add descriptive name to modal popup windows + +## v1.3.1 - 2018-01-23 + +### Fixes + +- Fix "stdout maxBuffer" error on Linux +- Fix Etcher not working / crashing on older Windows systems +- Fix not all partitions being unmounted after flashing on Linux +- Fix selection of images in folders with file extension on Mac OS + +### Misc + +- Update Electron to v1.7.11 + +## v1.3.0 - 2018-01-04 + +### Features + +- Display connected Compute Modules even if Windows doesn't have the necessary drivers to act on them +- Add read/write retry delays with backoff to ... +- Add native application menu (which fixes OS native window management shortcuts not working) + +### Fixes + +- Fix "Couldn't scan drives" error +- Ensure the writer process dies when the GUI application is killed +- Run elevated writing process asynchronously on Windows +- Fix trailing space in environment variables during Windows elevation +- Don't send analytics events when attempting to toggle a disabled drive +- Fix handling of transient write errors on Linux (EBUSY) +- Fix runaway perl process in drivelist on Mac OS + +### Misc + +- Update Electron from v1.7.9 to v1.7.10 +- Remove Angular dependency from image-writer + +## v1.2.1 - 2017-12-06 + +### Fixes + +- Fix handling of temporary read/write errors +- Don't send initial Mixpanel events before "Anonymous Tracking" settings are loaded +- Fix verification step reading from the cache + +## v1.2.0 - 2017-11-22 + +### Features + +- Display actual write speed +- Add the progress and status to the window title. +- Add a sudo-prompt upon launch on Linux-based systems. +- Add optional progress bars to drive-selector drives. +- Increase the flashing speed of usbboot discovered devices. +- Add eye candy to usbboot initialized devices. +- Integrate Raspberry Pi's usbboot technology. + +### Fixes + +- Fix bzip2 streaming with the new pipelines +- Remove Linux elevation meant for usbboot. +- Fix `LIBUSB_ERROR_NO_DEVICE` error at the end of usbboot. +- Gracefully handle scenarios where a USB drive is disconnected halfway through the usbboot procedure. +- Make sure the progress button is always rounded. +- Fix permission denied issues when XDG_RUNTIME_DIR is mounted with the `noexec` option. +- Fix Etcher being unable to read certain zip files +- Fix "Couldn't scan the drives: An unknown error occurred" error when there is a drive locked with BitLocker. +- Fix "Missing state eta" error when speed is zero +- Fix "Stuck on Starting..." error +- Fix situations where the process would get stuck while flashing + +### Misc + +- Add the Python version (2.7) to the CONTRIBUTING doc. +- Remove duplicate debug enabling in usbboot module. +- Update Electron to v1.7.9 +- Retry ejection various times before giving up on Windows. +- Try to use `$XDG_RUNTIME_DIR` to extract temporary scripts on GNU/Linux. + +## v1.1.2 - 2017-08-07 + +### Features + +- Add support for `.rpi-sdcard` images + +### Fixes + +- Avoid "broken" icon when selecting a zip image archive with invalid SVG +- Fix `UNABLE_TO_GET_ISSUER_CERT_LOCALLY` error at startup when behind certain proxies +- Fix `EHOSTDOWN` error at startup +- Display a user-friendly error message if the user is not in the sudoers file +- Make archive-embedded SVG icons work again +- Fix "imageBasename is not defined" error on the CLI +- Fix various drive scanning Windows errors + +### Misc + +- Improve Windows drive detection error codes. + +## v1.1.1 - 2017-07-25 + +### Fixes + +- Prevent "percentage above 100%" errors on DMG images +- Fix Etcher not starting flashes in AppImages +- Fix most "Unmount failed" errors on macOS + +## v1.1.0 - 2017-07-20 + +### Features + +- Add image name, drive name, and icon to OS notifications +- Add support for `.sdcard` images +- Start publishing RPM packages +- Generate single-binary portable installers on Windows +- Show friendlier error dialogs when opening an image results in an error +- Generate one-click Windows NSIS installers +- Show the application version in the WebView banners +- Show a warning message if the selected image has no partition table +- Make use of `pkg` to package the Etcher CLI +- Send anonymous analytics about package types +- Minor style improvements to the fallback success page banner +- Turn the update notifier modal into a native dialog + +### Fixes + +- Fix "You don't have access to this resource" error at startup when behind a firewall +- Fix `UNABLE_TO_VERIFY_LEAF_SIGNATURE` error at startup when behind a proxy +- Reset webview after navigating away from the success screen +- Fix occasional increased CPU usage because of perl regular expression in macOS +- Don't install to `C:\Program Files (x86)` on 64-bit Windows systems +- Fix "file is not accessible" error when flashing an image that lives inside a directory whose name is UTF-16 encoded on Windows. +- Fix various interrelated Windows `.bat` spawning issues +- Fix 0.0 GB Windows drive detection issues +- Cleanup drive detection temporary scripts in GNU/Linux and macOS +- Ensure no analytics events are sent if error reporting is disabled +- Retry various times on `EAGAIN` when spawning drive scanning scripts +- Don't break up size numbers in the drive selector + +### Misc + +- Remove "Advanced" settings subtitle +- Remove support for the `ETCHER_DISABLE_UPDATES` environment variable +- Swap speed and time below the flashing progress bar + +## v1.0.0 - 2017-05-12 + +### Features + +- Implement a dynamic finish page. +- Display nicer error dialog when reading an invalid image. + +### Fixes + +- Prevent drive from getting re-mounted in macOS even when the unmount on success setting is enabled. +- Fix `ECONNRESET` and `ECONNREFUSED` errors when checking for updates on unstable connections. +- Fix application stuck at "Starting..." on Windows. +- Fix error on startup when Windows username contained an ampersand. + +## v1.0.0-rc.5 - 2017-05-02 + +### Fixes + +- Fix various elevation issues on Windows +- Treat unknown images as octet stream +- Fix uncaught errors when cancelling elevation requests on Windows when the system's language is not English. + +## v1.0.0-rc.4 - 2017-04-22 + +### Fixes + +- Fix "Unmount failed" on Windows where the PC is connected to network drives. +- Various fixes for when drive descriptions contain special characters. + +### Misc + +- Show a friendly user message on EIO after many retries. +- Show user friendly messages for `EBUSY, read` and `EBUSY, write` errors on macOS. + +## v1.0.0-rc.3 - 2017-04-14 + +### Fixes + +- Show a user friendly message when the drive is unplugged half-way through. +- Fix "UNKNOWN: unknown error" error when unplugging an SD Card from an internal reader on Windows. +- Fix "function createError(opts) {}" error on validation failure. +- Fix "Unmount failed, invalid drive" error on Windows. +- Fix Apple disk image detection & streaming. + +### Misc + +- Improve error reporting accuracy. + +## v1.0.0-rc.2 - 2017-04-11 + +### Fixes + +- Display a user error if the image is no longer accessible when the writer starts. +- Prevent uncaught `EISDIR` when dropping a directory to the application. +- Fix "Path must be a string. Received undefined" when selecting Apple images. +- Don't interpret certain ISO images as unsupported. + +## v1.0.0-rc.1 - 2017-04-10 + +### Features + +- Add support for Apple Disk images. +- Add the un-truncated drive description to the selected drive step tooltip. +- Prevent flashing an image that is larger than the drive with the CLI. + +### Fixes + +- Prevent progress button percentage to exceed 100%. +- Don't print stack traces by default in the CLI. +- Prevent blank application when sending SIGINT on GNU/Linux and macOS. +- Fix unmounting freezing in macOS. +- Fix GNU/Linux udev error when `net.ifnames` is set. +- Fix `ENOSPC` image alignment errors. +- Fix errors when unplugging drives exactly when the drive scanning scripts are running. +- Fix several unmount related issues in all platforms. +- Fix "rawr i'm a dinosaur" bzip2 error. + +### Misc + +- Make errors more user friendly throughout the application. +- Don't report "invalid archive" errors to TrackJS. +- Stop drive scanning loop if an error occurs. +- Don't include user paths in Mixpanel analytics events. +- Provide a user friendly error message when no polkit authentication agent is available on the system. +- Show friendly drive name instead of device name in the main screen. +- Start reporting errors to Sentry instead of to TrackJS. + +## v1.0.0-beta.19 - 2017-02-24 + +### Features + +- Show warning when user tries to flash a Windows image +- Update the image step icon with an hexagonal "plus" icon. +- Update main page design to its new style. +- Swap the order of the drive and image selection steps. + +### Fixes + +- Fix `transformRequest` error at startup when not connected to the internet, or when on an unstable connection. +- Prevent flashing the drive where the source image is located. +- Fix text overflowing on tooltips. +- Don't ignore errors coming from the Windows drive detection script. +- Omit empty SD Card readers in the drive selector on Windows. +- Fix "Error: Command Failed" error when unmounting on Windows. +- Fix duplicate error messages on some errors. +- Fix 'MySQL' is not recognised as an internal or external command error on Windows. +- Ignore `stderr` output from drive detection scripts if they exit with code zero. + +### Misc + +- Improve validation error message. +- Emit an analytics event on `ENOSPC`. +- Normalize button text casing. +- Don't auto select system drives in unsafe mode. +- Use a OS dialog to show the "exit while flashing" warning. +- Capitalize every text throughout the application. + +## v1.0.0-beta.18 - 2017-01-16 + +### Features + +- Improve Etcher CLI error messages. +- Replace the `--robot` CLI option with an `ETCHER_CLI_ROBOT` environment variable. +- Sort supported extensions alphabetically in the image file-picker. +- Label system drives in the drive-list widget. +- Show available Etcher version in the update notifier. +- Confirm before user quits while writing. +- Add a changelog link to the update notifier modal. +- Make the image file picker attach to the main window (as a real modal). + +### Fixes + +- Fix alignment of single call to action buttons inside modals. +- Fix "Invalid message" error caused by the IPC client emitting multiple JSON objects as a single message. +- Fix "This key is already associated with an element of this collection" error when multiple partitions point to the same drive letter on Windows. +- Fix system drives detected as removable drives on Mac Mini. +- Fix sporadic "EIO: i/o error, read" errors during validation. +- Fix "EIO: i/o error, write" error. + +## v1.0.0-beta.17 - 2016-11-28 + +### Fixes + +- Fix command line arguments not interpreted correctly when running the CLI with a custom named NodeJS binary. +- Wrap drive names and descriptions in the drive selector widget. +- Allow the user to press ESC to cancel a modal dialog. +- Fix "Can't set the flashing state when not flashing" error. +- Fix writing process remaining alive after the GUI is closed. +- Check available permissions in the CLI early on. +- Fix `this.log is not a function` error when clicking "flash again". +- Fix duplicate drives in Windows. +- Fix drive scanning exceptions on GNU/Linux systems with `net.ifnames` enabled. +- Fix `0x80131700` error when scanning drives on Windows. +- Fix internal SDCard drive descriptions. +- Fix unmount issues in GNU/Linux and OS X when paths contain spaces. +- Fix "Not Enough Space" error when flashing unaligned images. +- Fix `at least one volume could not be unmounted` error in OS X. + +## v1.0.0-beta.16 - 2016-10-28 + +### Features + +- Use info icon instead of "SHOW FULL FILE NAME" in first step. +- Display image path base name as a tooltip on truncated image name. +- Add support for `etch` images. + +### Fixes + +- Fix Etcher leaving zombie processes behind in GNU/Linux. +- Prevent escaping issues during elevation by surrounding paths in double quotes. +- Fix "Unexpected end of JSON" error in Windows. +- Fix drag and drop not working anymore. +- Don't clear selection state when re-selecting an image. + +### Misc + +- Publish standalone Windows builds. + +## v1.0.0-beta.15 - 2016-09-26 + +### Features + +- Allow the user to disable auto-update notifications with an environment variable. +- Allow images to declare a recommended minimum drive size. + +### Fixes + +- Fix flashing never starting after elevation in GNU/Linux. +- Fix sporadic EPERM write errors on Windows. +- Fix incorrect validation errors when flashing bzip2 images. +- Fix `cscript is not recognised as an internal or external command` Windows error. + +## v1.0.0-beta.14 - 2016-09-12 + +### Features + +- Allow archive images to configure a certain amount of bytes to be zeroed out from the beginning of the drive when using bmaps. +- Make the "Need help?" link dynamically open the image support url. +- Add `.bmap` support. + +### Fixes + +- Don't clear the drive selection if clicking the "Retry" button. +- Fix "`modal.dismiss` is not a function" exception. +- Prevent `ENOSPC` if the drive capacity is equal to the image size. +- Prevent failed validation due to drive getting auto-mounted in GNU/Linux. +- Fix incorrect estimated entry sizes in certain ZIP archives. +- Show device id if device doesn't have an assigned drive letter in Windows. +- Fix `blkid: command not found` error in certain GNU/Linux distributions. + +### Misc + +- Upgrade `etcher-image-stream` to v4.3.0. +- Upgrade `drivelist` to v3.3.0. +- Improve speed when retrieving archive image metadata. +- Improve image full file name modal tooltip. + +## v1.0.0-beta.13 - 2016-08-05 + +### Features + +- Show "Unmounting..." while unmounting a drive. +- Perform drive auto-selection even when there is no selected image. + +### Fixes + +- Prevent selected drive from getting auto-removed when navigating back to the main screen from another screen. +- Fix new available drives not being recognised automatically in Windows. +- Fix application stuck at "Finishing". +- Display an error if no graphical polkit authentication agent was found. +- Only enable error reporting if running inside an `asar`. +- Fix "backdrop click" uncaught errors on modals. + +### Misc + +- Fix internal removable drives considered system drives in macOS Sierra. +- Upgrade `etcher-image-write` to v6.0.1. +- Upgrade `removedrive` to v1.0.0. + +## v1.0.0-beta.12 - 2016-07-26 + +### Features + +- Support rich image extensions. +- Add support for `raw` images. +- Display a nice alert ribbon if drive runs out of space. +- Validate the existence of the passed drive. +- Add an "unsafe" option to bypass drive protection. + +### Fixes + +- Escape quotes from image paths to prevent Bash errors on GNU/Linux and OS X. +- Check if drive is large enough using the final uncompressed size of the image. + +### Misc + +- Upgrade `drivelist` to v3.2.4. + +## v1.0.0-beta.11 - 2016-07-17 + +### Features + +- Set dialog default directory to the place where the AppImage was run from in GNU/Linux. + +### Fixes + +- Don't throw an "Invalid image" error if the extension is not in lowercase. +- Fix `ENOENT` error when selecting certain images with multiple extensions on GNU/Linux. +- Fix flashing not starting when an image name contains a space. +- Fix error when writing images containing parenthesis in GNU/Linux and OS X. +- Fix error when cancelling an elevation request. +- Fix incorrect ETA numbers in certain timezones. +- Fix state validation error when speed equals zero. +- Display `*.zip` in the supported images tooltip. +- Fix uncaught exception when showing the update notifier modal. + +### Misc + +- Upgrade `etcher-image-write` to v5.0.2. + +## v1.0.0-beta.10 - 2016-06-27 + +### Features + +- Add support for `dsk` images. +- Only elevate the writer process instead of the whole application. +- Make sure a drive is instantly deselected if its not available anymore. +- Make Etcher CLI `--robot` option output parseable JSON strings. + +### Fixes + +- Fix an error that prevented an AppImage from being directly ran as `root`. +- Ensure we pass the correct argument types to `electron.dialog.showErrorBox()`. +- Don't re-check for updates when navigating back to the main screen. +- Emit window progress even when not on the main screen. +- Improve aliasing of the striped progress button. +- Fix `EPERM` errors on Windows. + +### Misc + +- Add documentation for the Etcher CLI. +- Add a GitHub issue template. +- Open DevTools in "undocked" mode by default. + +## v1.0.0-beta.9 - 2016-06-20 + +### Fixes + +- Don't interpret image file name information between dots as image extensions. + +## v1.0.0-beta.8 - 2016-06-15 + +### Features + +- Display ETA during flash and check. +- Show an informative label if the drive is not large enough for the selected image. +- Show an informative label if the drive is locked (write protected). + +### Fixes + +- Prevent certain system drives to be detected as removable in GNU/Linux. +- Fix external resources not opening on GNU/Linux when the application is elevated. +- Don't show an unnecessary scroll bar in the update notifier modal. +- Prevent selection of invalid images by drag and drop. +- Fix `EPERM` errors on Windows on drives formatted with a GUID Partition Table. +- Prevent a very long image name from breaking the UI. + +### Misc + +- Write a document explaining Etcher's architecture. + +## v1.0.0-beta.7 - 2016-05-26 + +### Features + +- Add `gzip` compression support. +- Add `bzip2` compression support. +- Provide a GUI elevation dialog for GNU/Linux. + +### Fixes + +- Fix broken image drag and drop functionality. +- Prevent global shortcuts from interfering with another applications. +- Prevent re-activating the "Flash" button with the keyboard shortcuts when a flash is already in process. +- Fix certain non-removable Windows devices not being filtered out. +- Display non-mountable Windows drives in the drive selector. + +### Misc + +- Upgrade Electron to v1.1.1. +- Various improvements to the build system. + +## v1.0.0-beta.6 - 2016-05-12 + +### Features + +- Implement update notifier modal. +- Implement writing by forking the Etcher CLI as a child process. + +### Fixes + +- Prevent selection of drives that are not large enough for the selected image. + +### Misc + +- Remove implicit "Enable" from settings screen items. + +## v1.0.0-beta.5 - 2016-05-04 + +### Features + +- Add `xz` compression support. + +### Fixes + +- Improve "Select Image" supported file types label. +- Fix error that prevented the application to be elevated correctly on Windows. + +### Misc + +- Deprecate GNU/Linux `.tar.gz` installers in favor of AppImages. + +## v1.0.0-beta.4 - 2016-04-22 + +### Features + +- Generate [AppImage](http://appimage.org) packages for GNU/Linux. +- Add application version to footer, which links to the `CHANGELOG`. +- Allow to bypass elevation with an environment variable (`ETCHER_BYPASS_ELEVATION`). + +### Fixes + +- Improve drive selector modal. +- Add dashed underline stlying to footer links. + +### Misc + +- Upgrade Electron to v0.37.6. +- Integrate Etcher CLI in this git repository. + +## v1.0.0-beta.3 - 2016-04-17 + +### Features + +- Show drive name in drive selector modal. +- Add subtle hover styling to footer links. +- Implement OS notifications on completion. +- Allow to drag and drop an image to the first step. +- Add Etcher logo to application footer. +- Add "Change" button links below each step. +- Invert progress bar stripes during validation. + +### Fixes + +- Fix window contents being pushed below when opening the drive selector modal. +- Detect removal of selected drive. +- Detect MacBook SDCard readers in OS X. +- Improve removable drive detection on Windows. +- Keep one decimal in Windows drive sizes. +- Prevent error dialog not showing on malformed `Error` objects. +- Fix window being resizable on GNU/Linux. +- Hide drive selector modal if no available drives. +- Make drive selector modal react to drive auto-selection. +- Improve UX when attempting to re-selecta single available drive. +- Reset writer state on flash error. +- Fix `stream.push() after EOF` error when flashing unaligned images. + +### Misc + +- Compress Linux executables and libraries. +- Compress Windows DLLs. +- Make GNU/Linux binary lowercase. +- Replace all occurrences of "burn" with "flash". + +## v1.0.0-beta.2 - 2016-04-07 + +### Features + +- Implement a new drive selector modal widget. +- Log Etcher version in Mixpanel and TrackJS events to aid debugging. +- Implement write validation support. +- Add a setting to enable/disable write validation. + +### Fixes + +- Make sure window size is uniform between platforms. +- Fix "Use same image" button not preserving the image selection. +- Fix step vertical bars slight mis-alignment. +- Fix vertical spacing between success message and disk unmount notice label. +- Fix focus CSS style being persisted in the buttons after a click in some cases. +- Fix uncaught exception if no file was selected from a dialog. +- Fix external URL opening freezing applications in GNU/Linux. +- Fix code-signing issues in OS X in some systems. + +### Misc + +- Heavy general refactoring. + +## v1.0.0-beta.1 - 2016-03-28 + +### Features + +- Allow window to be dragged from anywhere. +- Add more application metadata to installation package. +- Setup code-signing for Windows. + +### Fixes + +- Fix uncaught error after rejecting elevation in OS X. +- Upgrade `drivelist` to v2.0.9, which includes various drive scanning improvements. +- Make sure error is logged if its trapped with an error dialog. +- Fix broken state when going to settings from the success screen. +- Fix `Cannot read property 'length' of undefined` frequent issue. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..430d42b --- /dev/null +++ b/LICENSE @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS diff --git a/README.md b/README.md new file mode 100644 index 0000000..75cddc8 --- /dev/null +++ b/README.md @@ -0,0 +1,120 @@ +# Etcher + +> Flash OS images to SD cards & USB drives, safely and easily. + +Etcher is a powerful OS image flasher built with web technologies to ensure +flashing an SDCard or USB drive is a pleasant and safe experience. It protects +you from accidentally writing to your hard-drives, ensures every byte of data +was written correctly, and much more. It can also directly flash Raspberry Pi devices that support [USB device boot mode](https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#usb-device-boot-mode). + +[![Current Release](https://img.shields.io/github/release/balena-io/etcher.svg?style=flat-square)](https://balena.io/etcher) +[![License](https://img.shields.io/github/license/balena-io/etcher.svg?style=flat-square)](https://github.com/balena-io/etcher/blob/master/LICENSE) +[![Balena.io Forums](https://img.shields.io/discourse/https/forums.balena.io/topics.svg?style=flat-square&label=balena.io%20forums)](https://forums.balena.io/c/etcher) + +--- + +[**Download**][etcher] | [**Support**][support] | [**Documentation**][user-documentation] | [**Contributing**][contributing] | [**Roadmap**][milestones] + +## Supported Operating Systems + +- Linux; most distros; Intel 64-bit. +- Windows 10 and later; Intel 64-bit. +- macOS 10.13 (High Sierra) and later; both Intel and Apple Silicon. + +## Installers + +Refer to the [downloads page][etcher] for the latest pre-made +installers for all supported operating systems. + +## Packages + +#### Debian and Ubuntu based Package Repository (GNU/Linux x86/x64) + +Package for Debian and Ubuntu can be downloaded from the [Github release page](https://github.com/balena-io/etcher/releases/) + +##### Install .deb file using apt + + ```sh + sudo apt install ./balena-etcher_******_amd64.deb + ``` + +##### Uninstall + + ```sh + sudo apt remove balena-etcher + ``` + +#### Redhat (RHEL) and Fedora-based Package Repository (GNU/Linux x86/x64) + +##### Yum + +Package for Fedora-based and Redhat can be downloaded from the [Github release page](https://github.com/balena-io/etcher/releases/) + +1. Install using yum + +```sh + sudo yum localinstall balena-etcher-***.x86_64.rpm +``` + +#### Arch/Manjaro Linux (GNU/Linux x64) + +Etcher is offered through the Arch User Repository and can be installed on both Manjaro and Arch systems. You can compile it from the source code in this repository using [`balena-etcher`](https://aur.archlinux.org/packages/balena-etcher/). The following example uses a common AUR helper to install the latest release: + +```sh +yay -S balena-etcher +``` + +##### Uninstall + +```sh +yay -R balena-etcher +``` + +#### WinGet (Windows) + +This package is updated by [gh-action](https://github.com/vedantmgoyal2009/winget-releaser), and is kept up to date automatically. + +```sh +winget install balenaEtcher #or Balena.Etcher +``` + +##### Uninstall + +```sh +winget uninstall balenaEtcher +``` + +#### Chocolatey (Windows) + +This package is maintained by [@majkinetor](https://github.com/majkinetor), and +is kept up to date automatically. + +```sh +choco install etcher +``` + +##### Uninstall + +```sh +choco uninstall etcher +``` + +## Support + +If you're having any problem, please [raise an issue][newissue] on GitHub, and +the balena.io team will be happy to help. + +## License + +Etcher is free software and may be redistributed under the terms specified in +the [license]. + +[etcher]: https://balena.io/etcher +[electron]: https://electronjs.org/ +[electron-supported-platforms]: https://electronjs.org/docs/tutorial/support#supported-platforms +[support]: https://github.com/balena-io/etcher/blob/master/docs/SUPPORT.md +[contributing]: https://github.com/balena-io/etcher/blob/master/docs/CONTRIBUTING.md +[user-documentation]: https://github.com/balena-io/etcher/blob/master/docs/USER-DOCUMENTATION.md +[milestones]: https://github.com/balena-io/etcher/milestones +[newissue]: https://github.com/balena-io/etcher/issues/new +[license]: https://github.com/balena-io/etcher/blob/master/LICENSE diff --git a/README.wehub.md b/README.wehub.md new file mode 100644 index 0000000..bf4c1cc --- /dev/null +++ b/README.wehub.md @@ -0,0 +1,7 @@ +# WeHub 来源说明 + +- 原始项目:`balena-io/etcher` +- 原始仓库:https://github.com/balena-io/etcher +- 导入方式:上游默认分支的最新快照 +- 原作者、版权和许可证信息以原始仓库及本仓库 LICENSE 为准 +- 本文件仅用于记录来源,不代表 WeHub 是原项目作者 diff --git a/after-install.tpl b/after-install.tpl new file mode 100644 index 0000000..216ed73 --- /dev/null +++ b/after-install.tpl @@ -0,0 +1,11 @@ +#!/bin/bash + +# Link to the binary +# Must hardcode balenaEtcher directory; no variable available +ln -sf '/opt/balenaEtcher/${executable}' '/usr/bin/${executable}' + +# SUID chrome-sandbox for Electron 5+ +chmod 4755 '/opt/balenaEtcher/chrome-sandbox' || true + +update-mime-database /usr/share/mime || true +update-desktop-database /usr/share/applications || true diff --git a/assets/dmg/background.png b/assets/dmg/background.png new file mode 100755 index 0000000000000000000000000000000000000000..7b7c897040e4dd45e44f1558cc097f274f4ecaf2 GIT binary patch literal 39025 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 B(8T}% literal 0 HcmV?d00001 diff --git a/assets/dmg/background.tiff b/assets/dmg/background.tiff new file mode 100755 index 0000000000000000000000000000000000000000..7a191f4a09385f0980a105ae07f52f9f1854b7bb GIT binary patch literal 115576 zcmaHy`9IWa{QmFv>@x;q-waC=^}Oy~yMO@zcQG&_AM;}!A&%uZhB3M$ zx2Q>Sox{DY8~u$G3SA?-yO&bzG%1jhMq-J>ZM zc|ADZ|8`W@Ux&Iw4+d0&R5_#B&G269apqt<>V~MSKpj zZ3-|tGah|7sAu`8-T50!$;x)RXLdEu#2yL06MbXP)zd3oDt1kC@i(3yJQ{Lm`Ns*# zCx_NU?e!FjhL)0!h2D)kp7mfQIc<-9bHJ6k)s)!kKXXU#{JoZ%zIVIcnf=edq@CD% zZ~u+IKCY*;)Qiu|z5nqmDx1##vT#xn~tA0953*Y zv3+d$;B?$yS`W<@dDo+|_jX>F%Zg~ZFxAB!_^#}-IQhs=ZBM|g>>ZZ?z?3E;V6N%U z4F1r~uUQ)9A^`ad0SUnuTJk{P7Ib#tQ~9C`cK*qoc_A>%^!YLV5PtMprXMw$$QLrD zvo!Snx|Kp6+B%%c7G7{CWpXWp_6Hvw1%OQx@d7Q>rSRE~3%vPcdx}(^^I}Qh^}VJ_ zMXoPP=D%h*P)g`ar9l?8-umV4uS!k5X)pe(7+*debp1u5Du9_ZrXha$8{10tiza;q z1t=sT6U?VoN#h?vDZmUAJ07d_8-LVWv*3*Zqbm+yC44P%+2&6m6DOjS2U(J{@=qfH1&qHh|SyUrrsp~ ztl4{GU;C5yDgV~I_;K=H@#|FE+Mr6AXk;U-^dW{9s$^@SVD_?4V($gFjO~_b^GR`r*!p1BKyYk@6N6-191;yM_1f3iDtgk9dKY2P zXwb1h^KXLVx+A%-}0M&5FZomGZK*8mb$h~|M*#yIoo> zi`v06@9ZK;P~=456FhUBWRJWx<4Fcn(t08)zcHLJAdnv*2HQ( zrRE>aY1)nd{Or8IXQ?|D21JNW24aFPm{4_6>Ft+{s5rBR3U#sOi&0~*X{dEZhf(+DANEj$0GgExCTRI{?DbE7D-3;3zi0LE>j~-(m2XauFJb1D^^_y!kt3oWqmBhZ z@_9BtX~>c;evve2;HCC*f9T7v$6@G&-H;+scM>H4%yfeIC9GSd;p5`37Vlvo2KX!h zk>znTfCqeg&`S@3DoS3GJraP%_0N_&$!&7k!oY&QVf^{)8b+>vY2KaBlM1)kkte0A zqp9~qdg9X0xLDQr+YDekR(V9s#e&QU&p-=D+%%d$J)<<@TojLW>NiD-9OQm&%k6&d zja;t-CJ1OgudNv6#_B5Vn1fTXC;)IU-)2szJ5`@;#6rUdXqLl zn#5IrP^`%Gokl{6p8Hle{V0p(a_Pq6fhWFUXBSP?UXHWHKTUdMu6XI!nNVfcobi%D z7h{&>rnfvUi+d^js-blqNGz;c)i8dk#aC^UEj_0>B70opjR*lWTTwK+Rw|QBG`lYG zG$e!(?DF8o4HDRf4Pq)fe)F)ZTb>2LxH@5c_R6u4?fbv}$Ct&h&4YqyV;3jl^0{nr zCu@LEw9=;pZaSL~O!Vl+o*Ju}vczFA4gJkQ&THwCBRb~f>Tm21pRSRQweHgQW*Qb< zXaz7XgvKMFyi}34O+6o)or^N?mWq6+&uR?ZklznH3DZJs0Sh2vQz(qsi+-`40hi^X zb!Bj2{&`i8l8|*OjgjFhPWUre@O2DcBm21bJt!G-w{={ZtjE4hWjFAEq|};~i2q;a z)MH3tbRSczHxgnhia!Q&qc~_L1qFM8pO#}z5S$(BSB_zf-U+F)bZtI@tp%m2lk?^8}Ej^9&o{z4ikjmw(s%3`_H~@ zZ%!QQ4C1dDF{`c~pV)b?R zR@Asuc+}hu1bp1mgEzuYdP;Bgex$5iL1>1a`Mq6XaY=-yScFn2mA?B!zwJekqXVy8 z+#=AB`wRD_L__@KRgA`+p`CegFjXLM`xzh;INsR+DiMfDZz$dwn^>9S>Qx*N2(Pz$Zhy%TzOTwGD;Jt zj5vtPmneDevxD{H^fyeH^65Yt+%2w4W8mmlk_#B%o!Tp%yW9HrrypV;M!?jw5L4?^ zitB$mN)2$JSz6ufUIE#`S@�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

-ZRS^JD($*=UHPSRV>QvL)n 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�VozQpzH0AeKWyxsig7Q41tnt_0}G= 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˃A^5Z!q0Ua1E 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 literal 0 HcmV?d00001 diff --git a/assets/icon.ico b/assets/icon.ico new file mode 100755 index 0000000000000000000000000000000000000000..307d4cbefc583ecefdd55fa70810dc3997b9fecd GIT binary patch literal 370070 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 literal 0 HcmV?d00001 diff --git a/assets/iconset/128x128.png b/assets/iconset/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..f9eba0e82934b200991ffee065a39433f9844a3f GIT binary patch literal 3022 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 Qa{vGU07*qoM6N<$f_96$6#xJL literal 0 HcmV?d00001 diff --git a/assets/iconset/16x16.png b/assets/iconset/16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..cb511066f3c647179d795e9975cf35f1d14cb39c GIT binary patch literal 479 zcmV<50U-W~P)vImNs4xW`zZ;_}K5^%T=s0BKA1`TL--+@R1A(C8r8)QkLBZ1E-Et%~WeFkF> z>g{Lv^xo#cBwxJ`sC_>|ci0RFPNNY_(NJl0UMozdgIJtRZQsbM8z$~gl;C#gdj(FR z%pU9*kg7mG&>s1{@KQotchtUuvjc65lR>VmnSKb z|6c!kA|$A4sr;NlBpG!b=xu-t2uc*ej(#+2n51Y@N*1!6Rv2OOeQK25vJvG`C1Hg7EWV?sL10?9$%sZ6qR2A1^^Rs VgH(h`@znqT002ovPDHLkV1kt|#MJ-* literal 0 HcmV?d00001 diff --git a/assets/iconset/256x256.png b/assets/iconset/256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..7d0e612e1bfaf882ec58a412c35245d8a07a0ad9 GIT binary patch literal 5532 zcmZWtXH-*Jw7w}oFknIl0TbGY(y@TFgr*=MNKuLyq=p%ZXHN_7JFpJ`0AXt@ z3r7HefK3R1;0LRV5ihTRl}wbSYm`&im8jUu5q^NFZ}zn`PuW#8-JAN`B~ zK*Ge@!qhqL>oUbY%%fAH{dR_EH!tvH_`Y{(=W6kiZtw?^mSZk2lgRE%P~mMs@0G@* z4NE;g5262>FGH%0g?_61N<|)>f0hYIz@$RlOO8*B=B?Dn%>9!utYP!eswX~d_0t-V zB4_xpee0WXWbdQ+)SkUa|M$6j>W)n=ihFGDKVkhByxA1a0Y?%*y7P=jr)k<(Y!qWtn8m~pbAB|CR?hU`cJDM! z=aUPGo?8~$lZ)m6^=m85ogRp@yHE`g!2{Is*08`SJ*Dlu8)x8FFa#i8!Fs{;5aGrt zJ>ZjH6^8?@k}bhsJi~j1TE2G?$BScNW8)_g!05;}8-@m6Qki}XuDgW+h6q3bmA5-1 zibMYyRIAyBr=qwO}rX;G6fgcP=qS6lge)Am~gA>FHM;x-VWnQ)l>8Xm>17~QDS zN60P_Ow6n}XoDNtuZ z-0wp)Xv0RaV*9pBwLgdMEmly@yqC3Ll914AeEm1Off2v?K;>P1bqa_}y6@fCM93Mx z*{Q_a>>=NxVa%Y1Bzx=cRTakCWOm2X&bDDDU3C$Yt_F+*+Y1@o?%TxJElgs#?*|N@ zLdsy3=e6!bT5fA-{f9!(xB%9ZoQ0%qW@PNvhn40BEeM3jQ;){kCfMNluD-U81xv)y9d6If*sR+e9LT<}(t;{zU{ z#dT?5tOWzxr9O?%mex$z<+3Z^3O#0ekqgiiM2Q+5Ljt_DxDSsW9DFcz>3pKwu1_)> zI%j{vkttAX@UY^c^^_ikRZuA%&-=YNI1pvR#UJdvJ0z;bY22G4$;;d+I$yf(PmY7u zh7^!+xtyBsZ!M6x^nz8&#AR{t@L(r=x`PBIiQO_e3;zH)6~Aj1IM+F3y|c|BiDlZ> zMCwC_DRA#+KJeDR6+Iu>UT4Fk&eB3WC6&LUK8va*tm}9Nu-d=mzi$4l^Gl$osKSG& zW-VuP{^%u+{E`77<5C8rtf#0GlN*Zf$h@-yE6q_Um(lod+WLzLd&@chRaAj--TNyQ z%ome(ol!3)+b6}Iqm<`R1%}{g3G?61sLq+Dfz_LT?~=n?_TIX*6j4;i(`_?ya4#B$ z$$Iu?jkg#VuQA;k)(H1*)NS!_Ho*xH@o89c&Gc0e(9)Id$ZU)Hz*D%3FENGI%*Bv=i3FE03iLvSCXu zF|fD$GI_OIubhmNQw zxovt#t~r1w_%n8s?5=!Et#|TsiXVhg1;abFwH4o zn&;phamu6P7?z5M(bE>BnOO|-$9=wYh2nDS#Z)IE`}X_}ZFf#`)kL*Iwm$CHM1WoE zWRV1RB0^R16(6U#B$}x8=2iH34)5->{OQhFm}NZ74BD9s|A5oD+Inm)^{$A5;ACoi z%-t|%i15UT_csb~c-Bo_1$lZb?d=U|!K^oUJ=pO131eDF%Lkh$T zmna(os!3=O!QjQCn7}E+sB1ku*|%2_c;xyI1>$%t`LwJ{=*3M-LViPN9UCu^J1r&3 z^u_kZ8CGu?2L>f*q`XH+@CP1b`M;aB1^nJL6nnNW&Jnn;Y*;tTCYySTiTp3nBW4mb z^-^whw>;%ZK*wjuxX};Pn>kd95r;WK+&(uU!&6r9+8^J`>ZS3*tLNfU?b{ZStTr>C zcHvUdbd`|joUt2qI8#}zTTkVQORAM?|qFQNnI zhpy* zTuis@hcMc^{XSH8idLo*J%+Y=Nw-%Q_T!siS~~ED%scsr`BXZ!dQ`{i)LiW5b-|%kdrH7zF{B7X$n9;c zG7=q_L}$3>NeTPK0e_6`))7sH!Ss~4N5^wceWJ`Ilb`q!g}wB<_%e0zx7{lvAf?aX+a%>;y^G-76lP+7hP z{A{h0OgeP`<6P0d+3M%F4(>kp`>t5P?t7E&l<344y9OjwQ{7ZE@#_GbH%~VzDk)$tIerfe@ z>uoJ1s406T12MFg$iA?g+liqI8w7-?bQ!KX6_+c1;_Uo~L_$>& zt?#E%<3jVOjUmj{8C1b30+Ogi?V&xp#Tz*6q&DXyy#QoKuRUHw1@qnKGk(D58Te5= z<;_TxN0{_W<`ZwTCZC>F%)nbSKm|Wb&whME!OE+IOZtQgcJk<7N|2cifDdo$InN!+ zKjvw*VLG}lz_}x)STC1`Xv4V1<`KV!cgzPgF$BT5W zt1jaLMFyg`L3%)wcbI$khFMjb#FEs#Zq|r=k7@rorHLtLNl|=qx+LZ3* z$o|WcuLj?rTCNwTFofrqr6dM#0aF~-UB5$C-VQty|rrqOOaTT+qu}bZ1du^BN+=& zgx95G@-;JV3d$D(Y^Cr(F*brU%3?*EfNNvzz_nR6{gG`^3M3&8#Jf{#F~PeLjgR5t zS8IIwe}(LIdb)ICjARB^_&#sDbwqVT?~&Sn!y4MMUreSim;sY$B6esrTx6!HEh-QA z_#0-~mR){EHU^fnCJH8^7C%4Aa`;nF@8ZcOKG@JU#bMmp3)2waOlpnKVOw7Fu(SDX^|Em9Dyf&uTN`O04ql-ne>s}4MbMj*dD>4K`^8ui zQ%SzAQ1a%W_fUR_u||S>qB5Y5mxO1^mn#>X|$&D+u&V1@!RyFQY3_=jXtS8;>x-Y`u&T0T*J)YbHu*KVSU>5 zuB`CihYx24@3_>W!L8v#PQNgUza}}Q|-{75woQ}cTrH_ftSq%hMV?7=&oD#_d?aA zEE5FaoHnekOjYA{*cd@Fa4_wCPxlKZoCqBs&gk9VjywXzqmhoAU7G0f&&%X5b}AVg6NeU z1;ER0AN;F?SDO?RIHhxewYbQb)ind?p;FrRJ6uRU8Vc00xLM^q-LDuZ@GJa!M+1-n zw$i;M<#|UnW#Pa8Jzgb`ACwfE`|;~=Aub-kid2Ymc%U|D%R20o99=05I<+3t*hSS} zL<3gH!HUIsA_DNW1waWP0}}%wWMG1O5)2Cp8#n-vzzPi(C;;HW3IUe?XM7}nK12kH zxOJ~e^en9Inm0=wo-6wViWkV$c>>k$2&#HY1|pgY0M~o3;{d>y^ZqdlIIBLu2gvI0 zetm+*UwvxKk}p*EN&z%M*+6j4joqQuSHmGGsTV*0bx8AP3i)Mt=)&DsMS5^ZRxSiE z@+hf@E{hbS=k)FdI$Viw&j!*YKoWQM6|bQAvrTwh89fEM;OEu(K^IxK*q`@5?Qquu=q3JxcI{TD%Q?ZO!> zYO?@#YZ=W^02@L*({(g%YGcf0cYXIN0-GXx66xE`CknVo@IZFp?k07h?1$MZH2A_$ zvMCh%=QPSK2xJq_k3<*b0)>F;^QDS<_RZnP+xxxl!e={NAOFo?hYjVm|Fzap-Pbk( ziL+Bw`p{hF@s~|EPFWwGjJps<*_rzGD-u2*@Y-?&f-tH0y@)VG+6)Sl(7ku-IgT8W ze<|?SHB>mY#}}7cuI%%OVaU7JESshWl-^oi>0Wp0Kghd0fBRdw+B4lo?oigksSF%* zttw`GLV)=FBmZelxv-}<42P`;Lz$X~HuSPyA@yHAP_jepzbM#zQO>5*Dw9TNdvABH zIed&3tebRf?i24I5APQ zRl+-tn){S-PegaPPi#!=`09w#5#`GitxLJZC-csodrh2@r>BTt^{5}HJ(7mQ`qDZ0 z8wP~g!Vd~Ho6p>NjtIQ9*VsP6tmtARRW@v4KB1vVaVu-0H%8|0m}3uoBdo+f9X@NC zCy-j>J!ZhTc6wy^akw>_WGN~g)X}w-`T??Kn{jFNQU9Zyfee~6wE7HmW~ePU=xKA0 z-urT=Kvw=)Kuo#%#~BVjFZV`-5e}FpcO83fKooj)Yp6DpCJJ>Bo$r>7$-5(DKZ8Pu zXrI5R(Q%KWI4HC>ZY6x|9}bB!r|jgi=KfA^c<-*@0%xRLbJ~sk_nT6q1YJF5Z#?lz zMZK@+!`*}#*u~n#?i9wA7bCTc$!fX&VjAa+*NwmaEazSs!dZ#iFUNUx z#lkRwdVOzVPN&ODRjuFhy@Lv{ZlaxYX~Jkgme=`z7b4ubOUHw1C!Y*&7_JfsiT}8U zV<}qO2{TFE4r9CXjpM2~IcKf=t}CA9s1WE6XK~*^j?nEqlfTP#B#BY-bQ96s%n{ZE z-oA<4Ejf1n`otIc#{Siit=R>iBRd5VN66=v3)Qqco*02}0>j24XpccHudYlNHAVC>U1FSZ6yPNekOeQr2lKy`3E#uQ<=H!sy@hX$O~T z0ojgGLV}hxC2U#0@}~Ac>)MM5f~4b(t_`LIOThLURotg@rl4{@VWwTnfR^XTIy4B8 zn?$`C!qi`xz~uIOm*;Nf;ZL=`@9E6|{z&tpa`D~9V<(O+p{&044b)v$G$8D2p(OY8 zo`TAm!3Szz2O|AL*AwLo>zDzZ>2k#6sQ-y@Us&tOWUw+xPB>cf^jJeDmAQ zhNQH|A)FQyW;#Rt|6B(tAXDI?VvUdWfsA9S(+Oq@Pap1Xw!Z<)1C1cfJl(b?OyEueAoS=P%VHqPQ1xHumyiUXzXd7nD6@60DW8Y4Uhk*@lYH%G%u@N-HK zTagcaGCA_6lS^`Dl7WFk&;XZzJF?X*bUQqx<&4pWob$d9Ee1lc7Dl{f4;5&p!+aaoBX$-$o9|XAOb#4G0iw;JXWsL zQUKU@D7i3GEk+$A!aj}SIC((TT(aK3=!$Ykosg)@W$`mpk^3=lKv4mj$G_Gz{k*f* zoTcEuVh(`00Poy3e6jGpjjEys?K$ymX9iKZz1M%y6u^e+qUB8-%&r|UaPMarYBqkI lM)hrizw!Tjyrg+zUV#48VED`OcR72*)|O{2D$Tr-{|ER8Lw^7O literal 0 HcmV?d00001 diff --git a/assets/iconset/32x32.png b/assets/iconset/32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..f1865bcbc9846ac765ef9bc9849b9f22d505f036 GIT binary patch literal 802 zcmV+-1Ks?IP)s91 zP#vTW3Fn(0qMrpc4KS$3kXAZ@(Yp;Du!fZK#(9+fDj)J6lm4Za<6p^ z&g--DY^Ocal_g8Q=e&FGdp=Ky6nN2pWK$H=_G7&s=IQc^vR}pMSol8Tla2 zPcN$G!$L)bDGghLBG1FKH`o#HzCDjk9t7uj|Gn*14}=w7Jr6Z@)_(znyA(~dpt9Y6 zS)!Hn#27%krS|4aGmnApVmmvs03StC-G!h6#j;xpK>mo@# z25}FiuArjLKZpCaa$rX!vit-TPf?Mm)6GT23aDT=;@H*_;KPB46|CwWRvAPcl@cJX zYHit=JuM@-gH?9$o<(gy8O5KCndm+)9>RDkQzz>A^-GLn9R)T3&>@!j9mc#6-NnZ1l3+Vb6sUBVuP!B z>1;v%CA+>~G^LZwKUl=f>3Oj*ciS@-iF!-o=VunZ911_Me53+!D5c<8&q?N{Y%d85 z(giyq{zl=5T$t2)q$v$EqzX^SV%Km4Co-nS2ur?7kB9PJ54d7a01-BsIEgjaxfdue zCG7jiap}PPDIPA=k2@76kgdLBy+LJqamchoThX1%^CUd}IQLZ`ags@!=JuTVX10;xAl1MCkm1v8xGm2Q|LlmJ!wqqMabo#QUw2H5_D{(~L}efi&j6S% z%T7E8Rd$ay#PL}}I-1emNpZ73A(Tj$ul$JE7_ZlJTb{$?zfXU7%3c@`5C9{QA6c`q z8?i9H;Nk{@yu;^V-aUdHq!rXLuc_8S)>~`~Wl8i5l4hlJKrMCAm0poF8AuZ9*1!hFtG6xI-w6*tJ z&+;$su2)IZ2qT9xOo5}4v|kR!e%O5pqf1tKsW>baBhD|r`}Vj-nxaKf0g^a?ag7dA z;Fwu*0tcS~Edfq&;w4sW`oZ+yc-A zVMH{LNDbN$luGlB%ZtDPFg#CdPP2nnoz7Z*0O&H$K;~)lGHH_Yqv3+*X?B31bqeft z*LMoVN9eT@+m;^*&JWuo0eBAJ%=4O`JB1PehxPneZOf0U30+WKQ~(BWS)PXtK$jV& zl~#7!azi!HrNm`19>k`K2wqTj3uJJEL9D=dBq`G+735}JA-#+;Wbh`_DaXGR{L-aU z5imv~#$7_A49P@ht$j z4{3TFMilOhJeBF9c^1h%a<)0ZEezGpJJ>{`izY2t3m%t&H^HBUUh6v0fHqoNHa fcvKs>{1adR>jBYmI5NDG00000NkvXXu0mjfn;k9d literal 0 HcmV?d00001 diff --git a/assets/iconset/512x512.png b/assets/iconset/512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..96852d6d3e95c6d5e6af03c3e92cfc1fa6dde05e GIT binary patch literal 11713 zcma)ic|6qL_y3(Sm=IIh3XS&OlI1N+mWDR(79k}{*6b!^UuTerqTcl;WQi2LRZ9 z;jgn-0YJikkpRsDf0lf^HsH^0&vPc8My__AK34Z^fzBOQYg_3Hcq@C`tF~5m{MYrcImgO_5>niCEWr=7i>6Me2+-c41uvUj_DsrZTa3NxmEtn*)<hkm(ns%6>#`QfAxS9ZOqCk`zR7VE_@yP566$^awZM zA3s4Zl9Tx+5`hL}fBxWsHVapC+!t=PbtcKFbtmJ`h>%-DC*cf=2&>I(sc?0H8v8wj z>LLCjKvf5Tz2-}*iCCPYd6EciGPNt1?q9MExjAG7Cv5VwU#~AZ$y8_2y7S0g!3Ye{ z9>E5Wu-}DAqE=Abi9%D$nU$9W! zW3QsW_2C~eR<}Aq@~2G|q1Nv6)|C2DQbL>rL*>!=+?7OX0TUq&v?uFv7g8qX`*Z{m z0S}-|zp56Rg$a3d*FBG|$J?B9w;`3zAdtY*km2*U7b~ _EDvA7uZyo}firb`^gt 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 literal 0 HcmV?d00001 diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 0000000..6669b9b --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,70 @@ +Etcher Architecture +=================== + +This document aims to serve as a high-level overview of how Etcher works, +specially oriented for contributors who want to understand the big picture. + +Technologies +------------ + +This is a non exhaustive list of the major frameworks, libraries, and other +technologies used in Etcher that you should become familiar with: + +- [Electron][electron] +- [NodeJS][nodejs] +- [Redux][redux] +- [ImmutableJS][immutablejs] +- [Sass][sass] +- [Mocha][mocha] +- [JSDoc][jsdoc] + +Module architecture +------------------- + +Instead of embedding all the functionality required to create a full-featured +image writer as a monolithic project, we try to hard to follow the ["lego block +approach"][lego-blocks]. + +This has the advantage of allowing other applications to re-use logic we +implemented for Etcher in their own project, even for things we didn't expect, +which leads to users benefitting from what we've built, and we benefitting from +user's bug reports, suggestions, etc, as an indirect way to make Etcher better. + +The fact that low-level details are scattered around many different modules can +make it challenging for a new contributor to wrap their heads around the +project as a whole, and get a clear high level view of how things work or where +to submit their work or bug reports. + +These are the main Etcher components, in a nutshell: + +- [Drivelist](https://github.com/balena-io-modules/drivelist) + +As the name implies, this module's duty is to detect the connected drives +uniformly in all major operating systems, along with valuable metadata, like if +a drive is removable or not, to prevent users from trying to write an image to +a system drive. + +- [Etcher](https://github.com/balena-io/etcher) + +This is the *"main repository"*, from which you're reading this from, which is +basically the front-end and glue for all previously listed projects. + +Summary +------- + +We always welcome contributions to Etcher as well as our documentation. If you +want to give back, but feel that your knowledge on how Etcher works is not +enough to tackle a bug report or feature request, use that as your advantage, +since fresh eyes could help unveil things that we take for granted, but should +be documented instead! + +[lego-blocks]: https://github.com/sindresorhus/ama/issues/10#issuecomment-117766328 +[exit-codes]: https://github.com/balena-io/etcher/blob/master/lib/shared/exit-codes.js +[gui-dir]: https://github.com/balena-io/etcher/tree/master/lib/gui +[electron]: http://electron.atom.io +[nodejs]: https://nodejs.org +[redux]: http://redux.js.org +[immutablejs]: http://facebook.github.io/immutable-js/ +[sass]: http://sass-lang.com +[mocha]: http://mochajs.org +[jsdoc]: http://usejsdoc.org diff --git a/docs/COMMIT-GUIDELINES.md b/docs/COMMIT-GUIDELINES.md new file mode 100644 index 0000000..203e018 --- /dev/null +++ b/docs/COMMIT-GUIDELINES.md @@ -0,0 +1,86 @@ +Commit Guidelines +================= + +We enforce certain rules on commits with the following goals in mind: + +- Be able to reliably auto-generate the `CHANGELOG.md` *without* any human +intervention. +- Be able to automatically and correctly increment the semver version number +based on what was done since the last release. +- Be able to get a quick overview of what happened to the project by glancing +over the commit history. +- Be able to automatically reference relevant changes from a dependency +upgrade. + + +Commit structure +---------------- + +Each commit message needs to specify the semver-type. Which can be `patch|minor|major`. +See the [Semantic Versioning][semver] specification for a more detailed explanation of the meaning of these types. +See balena commit guidelines for more info about the whole commit structure. + +``` +: +``` +or +``` + + +

+ +Change-Type: +``` + +The subject should not contain more than 70 characters, including the type and +scope, and the body should be wrapped at 72 characters. + +Tags +---- + +### `See: `/`Link: ` + +This tag can be used to reference a resource that is relevant to the commit, +and can be repeated multiple times in the same commit. + +Resource examples include: + +- A link to pull requests. +- A link to a GitHub issue. +- A link to a website providing useful information. +- A commit hash. + +Its recommended that you avoid relative URLs, and that you include the whole +commit hash to avoid any potential ambiguity issues in the future. + +If the commit type equals `upgrade`, this tag should be present, and should +link to the CHANGELOG section of the dependency describing the changes +introduced from the previously used version. + +Examples: + +``` +See: https://github.com/xxx/yyy/ +See: 49d89b4acebd80838303b011d30517cd6229fdbe +Link: https://github.com/xxx/yyy/issues/zzz +``` + +### `Closes: `/`Fixes: ` + +This tag is used to make GitHub close the referenced issue automatically when +the commit is merged. + +Its recommended that you provide the absolute URL to the GitHub issue rather +than simply writing the ID prefixed by a hash tag for convenience when browsing +the commit history outside the GitHub web interface. + +A commit can include multiple instances of this tag. + +Examples: + +``` +Closes: https://github.com/balena-io/etcher/issues/XXX +Fixes: https://github.com/balena-io/etcher/issues/XXX +``` + +[semver]: http://semver.org diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md new file mode 100644 index 0000000..c5e6813 --- /dev/null +++ b/docs/CONTRIBUTING.md @@ -0,0 +1,184 @@ +Contributing Guide +================== + +Thanks for your interest in contributing to this project! This document aims to +serve as a friendly guide for making your first contribution. + +High-level Etcher overview +-------------------------- + +Make sure you checkout our [ARCHITECTURE.md][ARCHITECTURE] guide, which aims to +explain how all the pieces fit together. + +Developing +---------- + +### Prerequisites + +#### Common + +- [NodeJS](https://nodejs.org) (at least v16.11) +- [Python 3](https://www.python.org) +- [jq](https://stedolan.github.io/jq/) +- [curl](https://curl.haxx.se/) +- [npm](https://www.npmjs.com/) + +```sh +pip install -r requirements.txt +``` + +You might need to run this with `sudo` or administrator permissions. + +#### Windows + +- [NSIS v2.51](http://nsis.sourceforge.net/Main_Page) (v3.x won't work) +- Either one of the following: + - [Visual C++ 2019 Build Tools](https://visualstudio.microsoft.com/vs/features/cplusplus/) containing standalone compilers, libraries and scripts + - The [windows-build-tools](https://github.com/felixrieseberg/windows-build-tools#windows-build-tools) should be installed along with NodeJS + - [Visual Studio Community 2019](https://visualstudio.microsoft.com/vs/) (free) (other editions, like Professional and Enterprise, should work too) + **NOTE:** Visual Studio doesn't install C++ by default. You have to rerun the + setup, select "Modify" and then check `Visual C++ -> Common Tools for Visual + C++` (see http://stackoverflow.com/a/31955339) +- [MinGW](http://www.mingw.org) + +You might need to `npm config set msvs_version 2019` for node-gyp to correctly detect +the version of Visual Studio you're using (in this example VS2019). + +The following MinGW packages are required: + +- `msys-make` +- `msys-unzip` +- `msys-zip` +- `msys-bash` +- `msys-coreutils` + +#### macOS + +- [Xcode](https://developer.apple.com/xcode/) + +It's not enough to have [Xcode Command Line Tools] installed. Xcode must be installed +as well. + +#### Linux + +- `libudev-dev` for libusb (for example install with `sudo apt install libudev-dev`, or on fedora `systemd-devel` contains the required package) + +### Cloning the project + +```sh +git clone --recursive https://github.com/balena-io/etcher +cd etcher +``` + +### Running the application + +#### GUI + +```sh +# Build and start application +npm start +``` + +Testing +------- + +To run the test suite, run the following command: + +```sh +npm test +``` + +Given the nature of this application, not everything can be unit tested. For +example: + +- The writing operating on real raw devices. +- Platform inconsistencies. +- Style changes. +- Artwork. + +We encourage our contributors to test the application on as many operating +systems as they can before sending a pull request. + +*The test suite is run automatically by CI servers when you send a pull +request.* + +We make use of [EditorConfig] to communicate indentation, line endings and +other text editing default. We encourage you to install the relevant plugin in +your text editor of choice to avoid having to fix any issues during the review +process. + +Updating a dependency +--------------------- + +- Install new version of dependency using npm +- Commit *both* `package.json` and `npm-shrinkwrap.json`. + +Diffing Binaries +---------------- + +Binary files are tagged as "binary" in the `.gitattributes` file, but also have +a `diff=hex` tag, which allows you to see hexdump-style diffs for binaries, +if you add the following to either your global or repository-local git config: + +```sh +$ git config diff.hex.textconv hexdump +$ git config diff.hex.binary true +``` + +And global, respectively: + +```sh +$ git config --global diff.hex.textconv hexdump +$ git config --global diff.hex.binary true +``` + +If you don't have `hexdump` available on your platform, +you can try [hxd], which is also a bit faster. + +Commit Guidelines +----------------- + +See [COMMIT-GUIDELINES.md][COMMIT-GUIDELINES] for a thorough guide on how to +write commit messages. + +Sending a pull request +---------------------- + +When sending a pull request, consider the following guidelines: + +- Write a concise commit message explaining your changes. + +- If applies, write more descriptive information in the commit body. + +- Mention the operating systems with the corresponding versions in which you +tested your changes. + +- If your change affects the visuals of the application, consider attaching a +screenshot. + +- Refer to the issue/s your pull request fixes, so they're closed automatically +when your pull request is merged. + +- Write a descriptive pull request title. + +- Squash commits when possible, for example, when committing review changes. + +Before your pull request can be merged, the following conditions must hold: + +- The linter doesn't throw any warning. + +- All the tests pass. + +- The coding style aligns with the project's convention. + +- Your changes are confirmed to be working in recent versions of the operating +systems we support. + +Don't hesitate to get in touch if you have any questions or need any help! + +[ARCHITECTURE]: https://github.com/balena-io/etcher/blob/master/docs/ARCHITECTURE.md +[COMMIT-GUIDELINES]: https://github.com/balena-io/etcher/blob/master/docs/COMMIT-GUIDELINES.md +[EditorConfig]: http://editorconfig.org +[shrinkwrap]: https://docs.npmjs.com/cli/shrinkwrap +[hxd]: https://github.com/jhermsmeier/hxd +[Xcode Command Line Tools]: https://developer.apple.com/library/content/technotes/tn2339/_index.html diff --git a/docs/FAQ.md b/docs/FAQ.md new file mode 100644 index 0000000..7da833c --- /dev/null +++ b/docs/FAQ.md @@ -0,0 +1,52 @@ +## Why is my drive not bootable? + +Etcher copies images to drives byte by byte, without doing any transformation to the final device, which means images that require special treatment to be made bootable, like Windows images, will not work out of the box. In these cases, the general advice is to use software specific to those kind of images, usually available from the image publishers themselves. You can find more information [here](https://github.com/balena-io/etcher/blob/master/docs/USER-DOCUMENTATION.md#why-is-my-drive-not-bootable). + +## How can I configure persistent storage? + +Some programs, usually oriented at making GNU/Linux live USB drives, include an option to set persistent storage. This is currently not supported by Etcher, so if you require this functionality, we advise to fallback to [UNetbootin](https://unetbootin.github.io/). + +## How do I flash Ubuntu ISOs + +Ubuntu images (and potentially some other related GNU/Linux distributions) have a peculiar format that allows the image to boot without any further modification from both CDs and USB drives. +A consequence of this enhancement is that some programs, like parted get confused about the drive's format and partition table, printing warnings such as: + +> /dev/xxx contains GPT signatures, indicating that it has a GPT table. However, it does not have a valid fake msdos partition table, as it should. Perhaps it was corrupted -- possibly by a program that doesn't understand GPT partition tables. Or perhaps you deleted the GPT table, and are now using an msdos partition table. Is this a GPT partition table? Both the primary and backup GPT tables are corrupt. Try making a fresh table, and using Parted's rescue feature to recover partitions. + +> Warning: The driver descriptor says the physical block size is 2048 bytes, but Linux says it is 512 bytes. + +All these warnings are safe to ignore, and your drive should be able to boot without any problems. +Refer to [the following message from Ubuntu's mailing list](https://lists.ubuntu.com/archives/ubuntu-devel/2011-June/033495.html) if you want to learn more. + +## How do I run Etcher on Wayland? + +The XWayland Server provides backwards compatibility to run any X client on Wayland, including Etcher. +This usually works out of the box on mainstream GNU/Linux distributions that properly support Wayland. If it doesn't, make sure the xwayland.so module is being loaded by declaring it in your [weston.ini](http://manpages.ubuntu.com/manpages/wily/man5/weston.ini.5.html): + +``` +[core] +modules=xwayland.so +``` + +## What are the runtime GNU/LINUX dependencies? + +[This entry](https://github.com/balena-io/etcher/blob/master/docs/USER-DOCUMENTATION.md#runtime-gnulinux-dependencies) aims to provide an up to date list of runtime dependencies needed to run Etcher on a GNU/Linux system. + +## How can I recover the broken drive? + +Sometimes, things might go wrong, and you end up with a half-flashed drive that is unusable by your operating systems, and common graphical tools might even refuse to get it back to a normal state. +To solve these kinds of problems, we've collected [a list of fail-proof methods](https://github.com/balena-io/etcher/blob/master/docs/USER-DOCUMENTATION.md#recovering-broken-drives) to completely erase your drive in major operating systems. + +## I receive "No polkit authentication agent found" error in GNU/Linux + +Etcher requires an available [polkit authentication agent](https://wiki.archlinux.org/index.php/Polkit#Authentication_agents) in your system in order to show a secure password prompt dialog to perform elevation. Make sure you have one installed for the desktop environment of your choice. + +## May I run Etcher in older macOS versions? + +Etcher GUI is based on the [Electron](http://electron.atom.io/) framework, [which only supports macOS 10.10 and newer versions](https://github.com/electron/electron/blob/master/docs/tutorial/support.md#supported-platforms). + +## Can I use the Flash With Etcher button on my site? + +You can use the Flash with Etcher button on your site or blog, if you have an OS that you want your users to be able to easily flash using Etcher, add the following code where you want to button to be: + +`` \ No newline at end of file diff --git a/docs/MAINTAINERS.md b/docs/MAINTAINERS.md new file mode 100644 index 0000000..5ef2cd4 --- /dev/null +++ b/docs/MAINTAINERS.md @@ -0,0 +1,106 @@ +# Maintaining Etcher + +This document is meant to serve as a guide for maintainers to perform common tasks. + +## Releasing + +### Release Types + +- **draft**: A continues snapshot of current master, made by the CI services +- **pre-release** (default): A continues snapshot of current master, made by the CI services +- **release**: Full releases + +Draft release is created from each PR, tagged with the branch name. +All merged PR will generate a new tag/version as a _pre-release_. +Mark the pre-release as final when it is necessary, then distribute the packages in alternative channels as necessary. + +#### Preparation + +- [Prepare the new version](#preparing-a-new-version) +- [Generate build artifacts](#generating-binaries) (binaries, archives, etc.) +- [Draft a release on GitHub](https://github.com/balena-io/etcher/releases) + - Upload build artifacts to GitHub release draft + +#### Testing + +- Test the prepared release and build artifacts properly on **all supported operating systems** to prevent regressions that went uncaught by the CI tests (see [MANUAL-TESTING.md](MANUAL-TESTING.md)) +- If regressions or other issues arise, create issues on the repository for each one, and decide whether to fix them in this release (meaning repeating the process up until this point), or to follow up with a patch release + +#### Publishing + +- [Publish release draft on GitHub](https://github.com/balena-io/etcher/releases) +- [Post release note to forums](https://forums.balena.io/c/etcher) +- [Submit Windows binaries to Symantec for whitelisting](#submitting-binaries-to-symantec) +- [Update the website](https://github.com/balena-io/etcher-homepage) +- Wait 2-3 hours for analytics (Sentry) to trickle in and check for elevated error rates, or regressions +- If regressions arise; pull the release, and release a patched version, else: +- [Upload deb & rpm packages to Cloudfront](#uploading-packages-to-cloudfront) +- Post changelog with `#release-notes` tag on internal chat +- If this release packs noteworthy major changes: + - Write a blog post about it, and / or + - Write about it to the Etcher mailing list + +### Generating binaries + +**Environment** + +Make sure to set the analytics tokens when generating production release binaries: + +```bash +export ANALYTICS_SENTRY_TOKEN="xxxxxx" +``` + +#### Linux + +##### Clean dist folder + +Delete `.webpack` and `out/`. + +##### Generating artifacts + +The artifacts are generated by the CI and published as draft-release or pre-release. +Etcher is built with electron-forge. Run: + +``` +npm run make +``` + +Our CI will appropriately sign artifacts for macOS and some Windows targets. + +### Uploading packages to Cloudfront + +Log in to cloudfront and upload the `rpm` and `deb` files. + +### Dealing with a Problematic Release + +There can be times where a release is accidentally plagued with bugs. If you +released a new version and notice the error rates are higher than normal, then +revert the problematic release as soon as possible, until the bugs are fixed. + +You can revert a version by deleting its builds from the S3 bucket and Bintray. +Refer to the `Makefile` for the up to date information about the S3 bucket +where we push builds to, and get in touch with the balena.io operations team to +get write access to it. + +The Etcher update notifier dialog and the website only show the a certain +version if all the expected files have been uploaded to it, so deleting a +single package or two is enough to bring down the whole version. + +Use the following command to delete files from S3: + +```bash +aws s3api delete-object --bucket --key +``` + +The Bintray dashboard provides an easy way to delete a version's files. + +### Submitting binaries to Symantec + +- [Report a Suspected Erroneous Detection](https://submit.symantec.com/false_positive/standard/) +- Fill out form: + - **Select Submission Type:** "Provide a direct download URL" + - **Name of the software being detected:** Etcher + - **Name of detection given by Symantec product:** WS.Reputation.1 + - **Contact name:** Balena.io Ltd + - **E-mail address:** hello@etcher.io + - **Are you the creator or distributor of the software in question?** Yes diff --git a/docs/MANUAL-TESTING.md b/docs/MANUAL-TESTING.md new file mode 100644 index 0000000..49bdff9 --- /dev/null +++ b/docs/MANUAL-TESTING.md @@ -0,0 +1,98 @@ +# Manual Testing + +This document describes a high-level script of manual tests to check for. We +should aim to replace items on this list with automated Spectron test cases. + +## Image Selection + +- [ ] Cancel image selection dialog +- [ ] Select an unbootable image (without a partition table), and expect a + sensible warning +- [ ] Attempt to select a ZIP archive with more than one image +- [ ] Attempt to select a tar archive (with any compression method) +- [ ] Change image selection +- [ ] Select a Windows image, and expect a sensible warning + +## Drive Selection + +- [ ] Open the drive selection modal +- [ ] Switch drive selection +- [ ] Insert a single drive, and expect auto-selection +- [ ] Insert more than one drive, and don't expect auto-selection +- [ ] Insert a locked SD Card and expect a warning +- [ ] Insert a too small drive and expect a warning +- [ ] Put an image into a drive and attempt to flash the image to the drive + that contains it +- [ ] Attempt to flash a compressed image (for which we can get the + uncompressed size) into a drive that is big enough to hold the compressed + image, but not big enough to hold the uncompressed version +- [ ] Enable "Unsafe Mode" and attempt to select a system drive +- [ ] Enable "Unsafe Mode", and if there is only one system drive (and no + removable ones), don't expect autoselection + +## Image Support + +Run the following tests with and without validation enabled: + +- [ ] Flash an uncompressed image +- [ ] Flash a Bzip2 image +- [ ] Flash a XZ image +- [ ] Flash a ZIP image +- [ ] Flash a GZ image +- [ ] Flash a DMG image +- [ ] Flash an image whose size is not a multiple of 512 bytes +- [ ] Flash a compressed image whose size is not a multiple of 512 bytes +- [ ] Flash an archive whose image size is not a multiple of 512 bytes +- [ ] Flash an archive image containing a logo +- [ ] Flash an archive image containing a blockmap file +- [ ] Flash an archive image containing a manifest metadata file + +## Flashing Process + +- [ ] Unplug the drive during flash or validation +- [ ] Click "Flash", cancel elevation dialog, and click "Flash" again +- [ ] Start flashing an image, try to close Etcher, cancel the application + close warning dialog, and check that Etcher continues to flash the image + +### Child Writer + +- [ ] Kill the child writer process (i.e. with `SIGINT` or `SIGKILL`), and + check that the UI reacts appropriately +- [ ] Close the application while flashing using the window manager close icon +- [ ] Close the application while flashing using the OS keyboard shortcut +- [ ] Close the application from the terminal using Ctrl-C while flashing +- [ ] Force kill the application (using a process monitor tool, etc) + +In all these cases, the child writer process should not remain alive. Note that +in some systems you need to open your process monitor tool of choice with extra +permissions to see the elevated child writer process. + +## GUI + +- [ ] Close application from the terminal using Ctrl-C while the application is + idle +- [ ] Click footer links that take you to an external website +- [ ] Attempt to change image or drive selection while flashing +- [ ] Go to the settings page while flashing and come back +- [ ] Flash consecutive images without closing the application +- [ ] Remove the selected drive right before clicking "Flash" +- [ ] Minimize the application +- [ ] Start the application given no internet connection + +## Success Banner + +- [ ] Click an external link on the success banner (with and without internet + connection) + +## Elevation Prompt + +- [ ] Flash an image as `root`/administrator +- [ ] Reject elevation prompt +- [ ] Put incorrect elevation prompt password +- [ ] Unplug the drive during elevation + +## Unmounting + +- [ ] Disable unmounting and flash an image +- [ ] Flash an image with a file system that is readable by the host OS, and + check that is unmounted correctly diff --git a/docs/PUBLISHING.md b/docs/PUBLISHING.md new file mode 100644 index 0000000..6025873 --- /dev/null +++ b/docs/PUBLISHING.md @@ -0,0 +1,82 @@ +Publishing Etcher +================= + +This is a small guide to package and publish Etcher to all supported operating +systems. + +Release Types +------------- + +Etcher supports **pre-release** and **final** release types as does Github. Each is +published to Github releases. +The release version is generated automatically from the commit messasges. + +Signing +------- + +### OS X + +1. Get our Apple Developer ID certificate for signing applications distributed +outside the Mac App Store from the balena.io Apple account. + +2. Install the Developer ID certificate to your Mac's Keychain by double +clicking on the certificate file. + +The application will be signed automatically using this certificate when +packaging for OS X. + +### Windows + +1. Get access to our code signing certificate and decryption key as a balena.io +employee by asking for it from the relevant people. + +2. Place the certificate in the root of the Etcher repository naming it +`certificate.p12`. + +Packaging +--------- + +Run the following command on each platform: + +```sh +npm run make +``` + +This will produce all targets (eg. zip, dmg) specified in forge.config.ts for the +host platform and architecture. + +The resulting artifacts can be found in `out/make`. + + +Publishing to Cloudfront +--------------------- + +We publish GNU/Linux Debian packages to [Cloudfront][cloudfront]. + +Log in to cloudfront and upload the `rpm` and `deb` files. + +Publishing to Homebrew Cask +--------------------------- + +1. Update [`Casks/etcher.rb`][etcher-cask-file] with the new version and + `sha256` + +2. Send a PR with the changes above to + [`caskroom/homebrew-cask`][homebrew-cask] + +Announcing +---------- + +Post messages to the [Etcher forum][balena-forum-etcher] announcing the new version +of Etcher, and including the relevant section of the Changelog. + +[aws-cli]: https://aws.amazon.com/cli +[cloudfront]: https://cloudfront.com +[etcher-cask-file]: https://github.com/caskroom/homebrew-cask/blob/master/Casks/balenaetcher.rb +[homebrew-cask]: https://github.com/caskroom/homebrew-cask +[balena-forum-etcher]: https://forums.balena.io/c/etcher +[github-releases]: https://github.com/balena-io/etcher/releases + +Updating EFP / Success-Banner +----------------------------- +Etcher Featured Project is automatically run based on an algorithm which promoted projects from the balena marketplace which have been contributed by the community, the algorithm prioritises projects which give uses the best experience. Editing both EFP and the Etcher Success-Banner can only be done by someone from balena, instruction are on the [Etcher-EFP repo (private)](https://github.com/balena-io/etcher-efp) diff --git a/docs/SUPPORT.md b/docs/SUPPORT.md new file mode 100644 index 0000000..7aee98f --- /dev/null +++ b/docs/SUPPORT.md @@ -0,0 +1,43 @@ +Getting help with BalenaEtcher +=============================== + +There are various ways to get support for Etcher if you experience an issue or +have an idea you'd like to share with us. + +Documentation +------ + +We have answers to a variety of frequently asked questions in the [user +documentation][documentation] and also in the [FAQs][faq] on the Etcher website. + + +Forums +------ + +We have a [Discourse forum][discourse] which is open to everyone, so please +come join us :). Drop us a line there and the balena.io staff and community +users will be happy to assist. Your question might already be answered, so take +a look at the existing threads before opening a new one! + +Make sure to mention the following information to help us provide better +support: + +- The BalenaEtcher version you're running. + +- The operating system you're running Etcher in. + +- Relevant logging output, if any, from DevTools, which you can open by + pressing `Ctrl+Shift+I` or `Cmd+Alt+I` depending on your platform. + +GitHub +------ + +If you encounter an issue or have a suggestion, head on over to BalenaEtcher's [issue +tracker][issues] and if there isn't a ticket covering it, [create +one][new-issue]. + +[discourse]: https://forums.balena.io/c/etcher +[issues]: https://github.com/balena-io/etcher/issues +[new-issue]: https://github.com/balena-io/etcher/issues/new +[documentation]: https://github.com/balena-io/etcher/blob/master/docs/USER-DOCUMENTATION.md +[faq]: https://etcher.io diff --git a/docs/USER-DOCUMENTATION.md b/docs/USER-DOCUMENTATION.md new file mode 100644 index 0000000..338292d --- /dev/null +++ b/docs/USER-DOCUMENTATION.md @@ -0,0 +1,226 @@ +Etcher User Documentation +========================= + +This document contains how-tos and FAQs oriented to Etcher users. + +Config +------ +Etcher's configuration is saved to the `config.json` file in the apps folder. +Not all the options are surfaced to the UI. You may edit this file to tweak settings even before launching the app. + +Why is my drive not bootable? +----------------------------- + +Etcher copies images to drives byte by byte, without doing any transformation +to the final device, which means images that require special treatment to be +made bootable, like Windows images, will not work out of the box. In these +cases, the general advice is to use software specific to those kind of +images, usually available from the image publishers themselves. + +Images known to require special treatment: + +- Microsoft Windows (use [Windows USB/DVD Download Tool][windows-usb-tool], + [Rufus][rufus], or [WoeUSB][woeusb]). + +- Windows 10 IoT (use the [Windows 10 IoT Core Dashboard][windows-iot-dashboard]) + +How can I configure persistent storage? +--------------------------------------- + +Some programs, usually oriented at making GNU/Linux live USB drives, include an +option to set persistent storage. This is currently not supported by Etcher, so +if you require this functionality, we advise to fallback to +[UNetbootin][unetbootin]. + +Deactivate desktop shortcut prompt on GNU/Linux +----------------------------------------------- + +This is a feature provided by [AppImages][appimage], where the applications +prompts the user to automatically register a desktop shortcut to easily access +the application. + +To deactivate this feature, `touch` any of the files listed below: + +- `$HOME/.local/share/appimagekit/no_desktopintegration` +- `/usr/share/appimagekit/no_desktopintegration` +- `/etc/appimagekit/no_desktopintegration` + +Alternatively, set the `SKIP` environment variable before executing the +AppImage: + +```sh +SKIP=1 ./Etcher-linux-.AppImage +``` + +Flashing Ubuntu ISOs +-------------------- + +Ubuntu images (and potentially some other related GNU/Linux distributions) have +a peculiar format that allows the image to boot without any further +modification from both CDs and USB drives. + +A consequence of this enhancement is that some programs, like `parted` get +confused about the drive's format and partition table, printing warnings such +as: + +> /dev/xxx contains GPT signatures, indicating that it has a GPT table. +> However, it does not have a valid fake msdos partition table, as it should. +> Perhaps it was corrupted -- possibly by a program that doesn't understand GPT +> partition tables. Or perhaps you deleted the GPT table, and are now using an +> msdos partition table. Is this a GPT partition table? Both the primary and +> backup GPT tables are corrupt. Try making a fresh table, and using Parted's +> rescue feature to recover partitions. + +*** + +> Warning: The driver descriptor says the physical block size is 2048 bytes, +> but Linux says it is 512 bytes. + +All these warnings are **safe to ignore**, and your drive should be able to +boot without any problems. + +Refer to [the following message from Ubuntu's mailing +list](https://lists.ubuntu.com/archives/ubuntu-devel/2011-June/033495.html) if +you want to learn more. + +Running on Wayland +------------------ + +Electron is based on Gtk2, which can't run natively on Wayland. Fortunately, +the [XWayland Server][xwayland] provides backwards compatibility to run *any* X +client on Wayland, including Etcher. + +This usually works out of the box on mainstream GNU/Linux distributions that +properly support Wayland. If it doesn't, make sure the `xwayland.so` module is +being loaded by declaring it in your [weston.ini]: + +``` +[core] +modules=xwayland.so +``` + +Runtime GNU/Linux dependencies +------------------------------ + +This entry aims to provide an up to date list of runtime dependencies needed to +run Etcher on a GNU/Linux system. + +### Electron specific + +> See [brightray's gyp file](https://github.com/electron/brightray/blob/master/brightray.gyp#L4) + +- gtk+-2.0 +- dbus-1 +- x11 +- xi +- xcursor +- xdamage +- xrandr +- xcomposite +- xext +- xfixes +- xrender +- xtst +- xscrnsaver +- gmodule-2.0 +- nss + +### Optional dependencies: + +- libnotify (for notifications) +- libspeechd (for text-to-speech) + +### Etcher specific: + +- liblzma (for xz decompression) + +Recovering broken drives +------------------------ + +Sometimes, things might go wrong, and you end up with a half-flashed drive that +is unusable by your operating systems, and common graphical tools might even +refuse to get it back to a normal state. + +To solve these kinds of problems, we've collected a list of fail-proof methods +to completely erase your drive in major operating systems. + +### Windows + +In Windows, we'll use [diskpart], a command line utility tool that comes +pre-installed in all modern Windows versions. + +- Open `cmd.exe` from either the list of all installed applications, or from + the "Run..." dialog usually accessible by pressing Ctrl+X. + +- Type `diskpart.exe` and press "Enter". You'll be asked to provide + administrator permissions, and a new prompt window will appear. The following + commands should be run **in the new window**. + +- Run `list disk` to list the available drives. Take note of the number id that + identifies the drive you want to clean. + +- Run `select disk N`, where `N` corresponds to the id from the previous step. + +- Run `clean`. This command will completely clean your drive by erasing any + existent filesystem. + +- Run `create partition primary`. This command will create a new partition. + +- Run `active`. This command will active the partition. + +- Run `list partition`. This command will show available partition. + +- Run `select partition N`, where `N` corresponds to the id of the newly available partition. + +- Run `format override quick`. This command will format the partition. You can choose a specific formatting by adding `FS=xx` where `xx` could be `NTFS or FAT or FAT32` after `format`. Example : `format FS=NTFS override quick` + +- Run `exit` to quit diskpart. + +### OS X + +Run the following command in `Terminal.app`, replacing `N` by the corresponding +disk number, which you can find by running `diskutil list`: + +```sh +diskutil eraseDisk FAT32 UNTITLED MBRFormat /dev/diskN +``` + +### GNU/Linux + +Make sure the drive is unmounted (`umount /dev/xxx`), and run the following +command as `root`, replacing `xxx` by your actual device path: + +```sh +dd if=/dev/zero of=/dev/xxx bs=512 count=1 conv=notrunc +``` + +"No polkit authentication agent found" error in GNU/Linux +---------------------------------------------------------- + +Etcher requires an available [polkit authentication +agent](https://wiki.archlinux.org/index.php/Polkit#Authentication_agents) in +your system in order to show a secure password prompt dialog to perform +elevation. Make sure you have one installed for the desktop environment of your +choice. + +Running in older macOS versions +------------------------------- + +Etcher GUI is based on the [Electron][electron] framework, [which only supports +macOS 10.10 (Yosemite) and newer versions][electron-supported-platforms]. + +[balena.io]: https://balena.io +[appimage]: http://appimage.org +[xwayland]: https://wayland.freedesktop.org/xserver.html +[weston.ini]: http://manpages.ubuntu.com/manpages/wily/man5/weston.ini.5.html +[diskpart]: https://technet.microsoft.com/en-us/library/cc770877(v=ws.11).aspx +[electron]: https://electronjs.org/ +[electron-supported-platforms]: https://electronjs.org/docs/tutorial/support#supported-platforms +[publishing]: https://github.com/balena-io/etcher/blob/master/docs/PUBLISHING.md +[windows-usb-tool]: https://www.microsoft.com/en-us/download/windows-usb-dvd-download-tool +[rufus]: https://rufus.akeo.ie +[unetbootin]: https://unetbootin.github.io +[windows-iot-dashboard]: https://developer.microsoft.com/en-us/windows/iot/downloads +[woeusb]: https://github.com/slacka/WoeUSB + +See [PUBLISHING](/docs/PUBLISHING.md) for more details about release types. \ No newline at end of file diff --git a/entitlements.mac.plist b/entitlements.mac.plist new file mode 100644 index 0000000..943a59b --- /dev/null +++ b/entitlements.mac.plist @@ -0,0 +1,24 @@ + + + + + com.apple.security.cs.allow-jit + + com.apple.security.cs.allow-unsigned-executable-memory + + com.apple.security.cs.allow-dyld-environment-variables + + com.apple.security.device.usb + + com.apple.security.files.user-selected.read-only + + com.apple.security.network.client + + com.apple.security.cs.disable-library-validation + + com.apple.security.get-task-allow + + com.apple.security.cs.disable-executable-page-protection + + + diff --git a/forge.config.ts b/forge.config.ts new file mode 100644 index 0000000..8caff54 --- /dev/null +++ b/forge.config.ts @@ -0,0 +1,159 @@ +import type { ForgeConfig } from '@electron-forge/shared-types'; +import { MakerSquirrel } from '@electron-forge/maker-squirrel'; +import { MakerZIP } from '@electron-forge/maker-zip'; +import { MakerDeb } from '@electron-forge/maker-deb'; +import { MakerRpm } from '@electron-forge/maker-rpm'; +import { MakerDMG } from '@electron-forge/maker-dmg'; +// import { MakerAppImage } from '@reforged/maker-appimage'; +import { AutoUnpackNativesPlugin } from '@electron-forge/plugin-auto-unpack-natives'; +import { WebpackPlugin } from '@electron-forge/plugin-webpack'; +import { exec } from 'child_process'; + +import { mainConfig, rendererConfig } from './webpack.config'; +import * as sidecar from './forge.sidecar'; + +import { hostDependencies, productDescription } from './package.json'; + +const osxSigningConfig: any = {}; +let winSigningConfig: any = {}; + +if (process.env.NODE_ENV === 'production') { + osxSigningConfig.osxNotarize = { + tool: 'notarytool', + appleId: process.env.XCODE_APP_LOADER_EMAIL, + appleIdPassword: process.env.XCODE_APP_LOADER_PASSWORD, + teamId: process.env.XCODE_APP_LOADER_TEAM_ID, + }; + + winSigningConfig = { + signWithParams: `-sha1 ${process.env.SM_CODE_SIGNING_CERT_SHA1_HASH} -tr ${process.env.TIMESTAMP_SERVER} -td sha256 -fd sha256 -d balena-etcher`, + }; +} + +const config: ForgeConfig = { + packagerConfig: { + asar: true, + icon: './assets/icon', + executableName: + process.platform === 'linux' ? 'balena-etcher' : 'balenaEtcher', + appBundleId: 'io.balena.etcher', + appCategoryType: 'public.app-category.developer-tools', + appCopyright: 'Copyright 2016-2023 Balena Ltd', + darwinDarkModeSupport: true, + protocols: [{ name: 'etcher', schemes: ['etcher'] }], + extraResource: [ + 'lib/shared/sudo/sudo-askpass.osascript-zh.js', + 'lib/shared/sudo/sudo-askpass.osascript-en.js', + ], + osxSign: { + optionsForFile: () => ({ + entitlements: './entitlements.mac.plist', + hardenedRuntime: true, + }), + }, + ...osxSigningConfig, + }, + rebuildConfig: { + onlyModules: [], // prevent rebuilding *any* native modules as they won't be used by electron but by the sidecar + }, + makers: [ + new MakerZIP(), + new MakerSquirrel({ + setupIcon: 'assets/icon.ico', + loadingGif: 'assets/icon.png', + ...winSigningConfig, + }), + new MakerDMG({ + background: './assets/dmg/background.tiff', + icon: './assets/icon.icns', + iconSize: 110, + contents: ((opts: { appPath: string }) => { + return [ + { x: 140, y: 250, type: 'file', path: opts.appPath }, + { x: 415, y: 250, type: 'link', path: '/Applications' }, + ]; + }) as any, // type of MakerDMGConfig omits `appPath` + additionalDMGOptions: { + window: { + size: { + width: 540, + height: 425, + }, + position: { + x: 400, + y: 500, + }, + }, + }, + }), + // new MakerAppImage({ + // options: { + // icon: './assets/icon.png', + // categories: ['Utility'], + // }, + // }), + new MakerRpm({ + options: { + icon: './assets/icon.png', + categories: ['Utility'], + productDescription, + requires: ['util-linux'], + }, + }), + new MakerDeb({ + options: { + icon: './assets/icon.png', + categories: ['Utility'], + section: 'utils', + priority: 'optional', + productDescription, + scripts: { + postinst: './after-install.tpl', + }, + depends: hostDependencies['debian'], + }, + }), + ], + plugins: [ + new AutoUnpackNativesPlugin({}), + new WebpackPlugin({ + mainConfig, + renderer: { + config: rendererConfig, + nodeIntegration: true, + entryPoints: [ + { + html: './lib/gui/app/index.html', + js: './lib/gui/app/renderer.ts', + name: 'main_window', + preload: { + js: './lib/gui/app/preload.ts', + }, + }, + ], + }, + }), + new sidecar.SidecarPlugin(), + ], + hooks: { + postPackage: async (_forgeConfig, options) => { + if (options.platform === 'linux') { + // symlink the etcher binary from balena-etcher to balenaEtcher to ensure compatibility with the wdio suite and the old name + await new Promise((resolve, reject) => { + exec( + `ln -s "${options.outputPaths}/balena-etcher" "${options.outputPaths}/balenaEtcher"`, + (err) => { + if (err) { + reject(err); + } else { + resolve(); + } + }, + ); + }); + } + }, + }, +}; + +export default config; diff --git a/forge.sidecar.ts b/forge.sidecar.ts new file mode 100644 index 0000000..890538b --- /dev/null +++ b/forge.sidecar.ts @@ -0,0 +1,168 @@ +import { PluginBase } from '@electron-forge/plugin-base'; +import type { + ForgeMultiHookMap, + ResolvedForgeConfig, +} from '@electron-forge/shared-types'; +import { WebpackPlugin } from '@electron-forge/plugin-webpack'; +import { DefinePlugin } from 'webpack'; + +import { execFileSync } from 'child_process'; +import * as fs from 'fs'; +import * as path from 'path'; + +import debug from 'debug'; + +const log = debug('sidecar'); + +function isStartScrpt(): boolean { + return process.env.npm_lifecycle_event === 'start'; +} + +function addWebpackDefine( + config: ResolvedForgeConfig, + defineName: string, + binDir: string, + binName: string, +): ResolvedForgeConfig { + config.plugins.forEach((plugin) => { + if (plugin.name !== 'webpack' || !(plugin instanceof WebpackPlugin)) { + return; + } + + const { mainConfig } = plugin.config as any; + if (mainConfig.plugins == null) { + mainConfig.plugins = []; + } + + const value = isStartScrpt() + ? // on `npm start`, point directly to the binary + path.resolve(binDir, binName) + : // otherwise point relative to the resources folder of the bundled app + binName; + + log(`define '${defineName}'='${value}'`); + + mainConfig.plugins.push( + new DefinePlugin({ + // expose path to helper via this webpack define + [defineName]: JSON.stringify(value), + }), + ); + }); + + return config; +} + +function build( + sourcesDir: string, + buildForArchs: string, + binDir: string, + binName: string, +) { + const commands: Array<[string, string[], object?]> = [ + ['tsc', ['--project', 'tsconfig.sidecar.json', '--outDir', sourcesDir]], + ]; + + buildForArchs.split(',').forEach((arch) => { + const binPath = isStartScrpt() + ? // on `npm start`, we don't know the arch we're building for at the time we're + // adding the webpack define, so we just build under binDir + path.resolve(binDir, binName) + : // otherwise build in arch-specific directory within binDir + path.resolve(binDir, arch, binName); + + // FIXME: rebuilding mountutils shouldn't be necessary, but it is. + // It's coming from etcher-sdk, a fix has been upstreamed but to use + // the latest etcher-sdk we need to upgrade axios at the same time. + commands.push(['npm', ['rebuild', 'mountutils', `--arch=${arch}`]]); + + commands.push([ + 'pkg', + [ + path.join(sourcesDir, 'util', 'api.js'), + '-c', + 'pkg-sidecar.json', + // `--no-bytecode` so that we can cross-compile for arm64 on x64 + '--no-bytecode', + '--public', + '--public-packages', + '"*"', + // always build for host platform and node version + // https://github.com/vercel/pkg-fetch/releases + '--target', + `node20-${arch}`, + '--output', + binPath, + ], + ]); + }); + + commands.forEach(([cmd, args, opt]) => { + log('running command:', cmd, args.join(' ')); + execFileSync(cmd, args, { shell: true, stdio: 'inherit', ...opt }); + }); +} + +function copyArtifact( + buildPath: string, + arch: string, + binDir: string, + binName: string, +) { + const binPath = isStartScrpt() + ? // on `npm start`, we don't know the arch we're building for at the time we're + // adding the webpack define, so look for the binary directly under binDir + path.resolve(binDir, binName) + : // otherwise look into arch-specific directory within binDir + path.resolve(binDir, arch, binName); + + // buildPath points to appPath, which is inside resources dir which is the one we actually want + const resourcesPath = path.dirname(buildPath); + const dest = path.resolve(resourcesPath, path.basename(binPath)); + log(`copying '${binPath}' to '${dest}'`); + fs.copyFileSync(binPath, dest); +} + +export class SidecarPlugin extends PluginBase { + name = 'sidecar'; + + constructor() { + super(); + this.getHooks = this.getHooks.bind(this); + log('isStartScript:', isStartScrpt()); + } + + getHooks(): ForgeMultiHookMap { + const DEFINE_NAME = 'ETCHER_UTIL_BIN_PATH'; + const BASE_DIR = path.join('out', 'sidecar'); + const SRC_DIR = path.join(BASE_DIR, 'src'); + const BIN_DIR = path.join(BASE_DIR, 'bin'); + const BIN_NAME = `etcher-util${process.platform === 'win32' ? '.exe' : ''}`; + + return { + resolveForgeConfig: async (currentConfig) => { + log('resolveForgeConfig'); + return addWebpackDefine(currentConfig, DEFINE_NAME, BIN_DIR, BIN_NAME); + }, + generateAssets: async (_config, platform, arch) => { + log('generateAssets', { platform, arch }); + build(SRC_DIR, arch, BIN_DIR, BIN_NAME); + }, + packageAfterCopy: async ( + _config, + buildPath, + electronVersion, + platform, + arch, + ) => { + log('packageAfterCopy', { + buildPath, + electronVersion, + platform, + arch, + }); + copyArtifact(buildPath, arch, BIN_DIR, BIN_NAME); + }, + }; + } +} diff --git a/lib/gui/app/app.ts b/lib/gui/app/app.ts new file mode 100644 index 0000000..f4ea790 --- /dev/null +++ b/lib/gui/app/app.ts @@ -0,0 +1,215 @@ +/* + * Copyright 2016 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as electron from 'electron'; +import * as remote from '@electron/remote'; +import type { Dictionary } from 'lodash'; +import { debounce, capitalize, values } from 'lodash'; +import outdent from 'outdent'; +import * as React from 'react'; +import * as ReactDOM from 'react-dom'; +import { v4 as uuidV4 } from 'uuid'; + +import * as packageJSON from '../../../package.json'; +import type { DrivelistDrive } from '../../shared/drive-constraints'; +import * as EXIT_CODES from '../../shared/exit-codes'; +import * as messages from '../../shared/messages'; +import * as availableDrives from './models/available-drives'; +import * as flashState from './models/flash-state'; +import * as settings from './models/settings'; +import { Actions, observe, store } from './models/store'; +import * as analytics from './modules/analytics'; +import { spawnChildAndConnect } from './modules/api'; +import * as exceptionReporter from './modules/exception-reporter'; +import * as osDialog from './os/dialog'; +import * as windowProgress from './os/window-progress'; +import MainPage from './pages/main/MainPage'; +import './css/main.css'; +import * as i18next from 'i18next'; +import type { SourceMetadata } from '../../shared/typings/source-selector'; + +window.addEventListener( + 'unhandledrejection', + (event: PromiseRejectionEvent | any) => { + // Promise: event.reason + // Anything else: event + const error = event.reason || event; + analytics.logException(error); + event.preventDefault(); + }, +); + +// Set application session UUID +store.dispatch({ + type: Actions.SET_APPLICATION_SESSION_UUID, + data: uuidV4(), +}); + +// Set first flashing workflow UUID +store.dispatch({ + type: Actions.SET_FLASHING_WORKFLOW_UUID, + data: uuidV4(), +}); + +console.log(outdent` + ${outdent} + _____ _ _ + | ___| | | | + | |__ | |_ ___| |__ ___ _ __ + | __|| __/ __| '_ \\ / _ \\ '__| + | |___| || (__| | | | __/ | + \\____/ \\__\\___|_| |_|\\___|_| + + Interested in joining the Etcher team? + Drop us a line at join+etcher@balena.io + + Version = ${packageJSON.version}, Type = ${packageJSON.packageType} +`); + +const debouncedLog = debounce(console.log, 1000, { maxWait: 1000 }); + +function pluralize(word: string, quantity: number) { + return `${quantity} ${word}${quantity === 1 ? '' : 's'}`; +} + +observe(() => { + if (!flashState.isFlashing()) { + return; + } + const currentFlashState = flashState.getFlashState(); + windowProgress.set(currentFlashState); + + let eta = ''; + if (currentFlashState.eta !== undefined) { + eta = `eta in ${currentFlashState.eta.toFixed(0)}s`; + } + let active = ''; + if (currentFlashState.type !== 'decompressing') { + active = pluralize('device', currentFlashState.active); + } + // NOTE: There is usually a short time period between the `isFlashing()` + // property being set, and the flashing actually starting, which + // might cause some non-sense flashing state logs including + // `undefined` values. + debouncedLog(outdent({ newline: ' ' })` + ${capitalize(currentFlashState.type)} + ${active}, + ${currentFlashState.percentage}% + at + ${(currentFlashState.speed || 0).toFixed(2)} + MB/s + (total ${(currentFlashState.speed * currentFlashState.active).toFixed(2)} MB/s) + ${eta} + with + ${pluralize('failed device', currentFlashState.failed)} + `); +}); + +function setDrives(drives: Dictionary) { + // prevent setting drives while flashing otherwise we might lose some while we unmount them + if (!flashState.isFlashing()) { + availableDrives.setDrives(values(drives)); + } +} + +// Spawning the child process without privileges to get the drives list +// TODO: clean up this mess of exports +export let requestMetadata: any; + +// start the api and spawn the child process +spawnChildAndConnect({ + withPrivileges: false, +}) + .then(({ emit, registerHandler }) => { + // start scanning + emit('scan', {}); + + // make the sourceMetada awaitable to be used on source selection + requestMetadata = async (params: any): Promise => { + emit('sourceMetadata', JSON.stringify(params)); + + return new Promise((resolve) => + registerHandler('sourceMetadata', (data: any) => { + resolve(JSON.parse(data)); + }), + ); + }; + + registerHandler('drives', (data: any) => { + setDrives(JSON.parse(data)); + }); + }) + .catch((error: any) => { + throw new Error(`Failed to start the flasher process. error: ${error}`); + }); + +let popupExists = false; + +analytics.initAnalytics(); + +window.addEventListener('beforeunload', async (event) => { + if (!flashState.isFlashing() || popupExists) { + return; + } + + // Don't close window while flashing + event.returnValue = false; + + // Don't open any more popups + popupExists = true; + + try { + const confirmed = await osDialog.showWarning({ + confirmationLabel: i18next.t('yesExit'), + rejectionLabel: i18next.t('cancel'), + title: i18next.t('reallyExit'), + description: messages.warning.exitWhileFlashing(), + }); + if (confirmed) { + // This circumvents the 'beforeunload' event unlike + // remote.app.quit() which does not. + remote.process.exit(EXIT_CODES.SUCCESS); + } + + popupExists = false; + } catch (error: any) { + exceptionReporter.report(error); + } +}); + +export async function main() { + try { + const { init: ledsInit } = require('./models/leds'); + await ledsInit(); + } catch (error: any) { + exceptionReporter.report(error); + } + + ReactDOM.render( + React.createElement(MainPage), + document.getElementById('main'), + // callback to set the correct zoomFactor for webviews as well + async () => { + const fullscreen = await settings.get('fullscreen'); + const width = fullscreen ? window.screen.width : window.outerWidth; + try { + electron.webFrame.setZoomFactor(width / settings.DEFAULT_WIDTH); + } catch (err) { + // noop + } + }, + ); +} diff --git a/lib/gui/app/components/drive-selector/drive-selector.tsx b/lib/gui/app/components/drive-selector/drive-selector.tsx new file mode 100644 index 0000000..bc65ebb --- /dev/null +++ b/lib/gui/app/components/drive-selector/drive-selector.tsx @@ -0,0 +1,569 @@ +/* + * Copyright 2019 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import ExclamationTriangleSvg from '@fortawesome/fontawesome-free/svgs/solid/triangle-exclamation.svg'; +import ChevronDownSvg from '@fortawesome/fontawesome-free/svgs/solid/chevron-down.svg'; +import type * as sourceDestination from 'etcher-sdk/build/source-destination/'; +import * as React from 'react'; +import type { ModalProps, TableColumn } from 'rendition'; +import { Flex, Txt, Badge, Link } from 'rendition'; +import styled from 'styled-components'; + +import type { + DriveStatus, + DrivelistDrive, +} from '../../../../shared/drive-constraints'; +import { + getDriveImageCompatibilityStatuses, + isDriveValid, + isDriveSizeLarge, +} from '../../../../shared/drive-constraints'; +import { compatibility, warning } from '../../../../shared/messages'; +import prettyBytes from 'pretty-bytes'; +import { getDrives, hasAvailableDrives } from '../../models/available-drives'; +import { getImage, isDriveSelected } from '../../models/selection-state'; +import { store } from '../../models/store'; +import { logException } from '../../modules/analytics'; +import { open as openExternal } from '../../os/open-external/services/open-external'; +import type { GenericTableProps } from '../../styled-components'; +import { Alert, Modal, Table } from '../../styled-components'; + +import type { SourceMetadata } from '../../../../shared/typings/source-selector'; +import { middleEllipsis } from '../../utils/middle-ellipsis'; +import * as i18next from 'i18next'; + +interface UsbbootDrive extends sourceDestination.UsbbootDrive { + progress: number; +} + +interface DriverlessDrive { + displayName: string; // added in app.ts + description: string; + link: string; + linkTitle: string; + linkMessage: string; + linkCTA: string; +} + +type Drive = DrivelistDrive | DriverlessDrive | UsbbootDrive; + +function isUsbbootDrive(drive: Drive): drive is UsbbootDrive { + return (drive as UsbbootDrive).progress !== undefined; +} + +function isDriverlessDrive(drive: Drive): drive is DriverlessDrive { + return (drive as DriverlessDrive).link !== undefined; +} + +function isDrivelistDrive(drive: Drive): drive is DrivelistDrive { + return typeof (drive as DrivelistDrive).size === 'number'; +} + +const DrivesTable = styled((props: GenericTableProps) => ( + {...props} /> +))` + [data-display='table-head'], + [data-display='table-body'] { + > [data-display='table-row'] > [data-display='table-cell'] { + &:nth-child(2) { + width: 32%; + } + + &:nth-child(3) { + width: 15%; + } + + &:nth-child(4) { + width: 15%; + } + + &:nth-child(5) { + width: 32%; + } + } + } +`; + +function badgeShadeFromStatus(status: string) { + switch (status) { + case compatibility.containsImage(): + return 16; + case compatibility.system(): + case compatibility.tooSmall(): + return 5; + default: + return 14; + } +} + +const InitProgress = styled( + ({ + value, + ...props + }: { + value: number; + props?: React.ProgressHTMLAttributes; + }) => { + return ; + }, +)` + /* Reset the default appearance */ + appearance: none; + + ::-webkit-progress-bar { + width: 130px; + height: 4px; + background-color: #dde1f0; + border-radius: 14px; + } + + ::-webkit-progress-value { + background-color: #1496e1; + border-radius: 14px; + } +`; + +export interface DriveSelectorProps + extends Omit { + write: boolean; + multipleSelection: boolean; + showWarnings?: boolean; + cancel: (drives: DrivelistDrive[]) => void; + done: (drives: DrivelistDrive[]) => void; + titleLabel: string; + emptyListLabel: string; + emptyListIcon: JSX.Element; + selectedList?: DrivelistDrive[]; + updateSelectedList?: () => DrivelistDrive[]; + onSelect?: (drive: DrivelistDrive) => void; +} + +interface DriveSelectorState { + drives: Drive[]; + image?: SourceMetadata; + missingDriversModal: { drive?: DriverlessDrive }; + selectedList: DrivelistDrive[]; + showSystemDrives: boolean; +} + +function isSystemDrive(drive: Drive) { + return isDrivelistDrive(drive) && drive.isSystem; +} + +export class DriveSelector extends React.Component< + DriveSelectorProps, + DriveSelectorState +> { + private unsubscribe: (() => void) | undefined; + tableColumns: Array>; + originalList: DrivelistDrive[]; + + constructor(props: DriveSelectorProps) { + super(props); + + const defaultMissingDriversModalState: { drive?: DriverlessDrive } = {}; + const selectedList = this.props.selectedList || []; + this.originalList = [...(this.props.selectedList || [])]; + + this.state = { + drives: getDrives(), + image: getImage(), + missingDriversModal: defaultMissingDriversModalState, + selectedList, + showSystemDrives: false, + }; + + this.tableColumns = [ + { + field: 'description', + label: i18next.t('drives.name'), + render: (description: string, drive: Drive) => { + if (isDrivelistDrive(drive)) { + const isLargeDrive = isDriveSizeLarge(drive); + const hasWarnings = + this.props.showWarnings && (isLargeDrive || drive.isSystem); + return ( + + {hasWarnings && ( + + )} + + {middleEllipsis(description, 32)} + + + ); + } + return {description}; + }, + }, + { + field: 'description', + key: 'size', + label: i18next.t('drives.size'), + render: (_description: string, drive: Drive) => { + if (isDrivelistDrive(drive) && drive.size !== null) { + return prettyBytes(drive.size); + } + }, + }, + { + field: 'description', + key: 'link', + label: i18next.t('drives.location'), + render: (_description: string, drive: Drive) => { + return ( + + {drive.displayName} + {isDriverlessDrive(drive) && ( + <> + {' '} + -{' '} + + this.installMissingDrivers(drive)}> + {drive.linkCTA} + + + + )} + + ); + }, + }, + { + field: 'description', + key: 'extra', + // We use an empty React fragment otherwise it uses the field name as label + label: <>, + render: (_description: string, drive: Drive) => { + if (isUsbbootDrive(drive)) { + return this.renderProgress(drive.progress); + } else if (isDrivelistDrive(drive)) { + return this.renderStatuses(drive); + } + }, + }, + ]; + } + + private driveShouldBeDisabled(drive: Drive, image?: SourceMetadata) { + return ( + isUsbbootDrive(drive) || + isDriverlessDrive(drive) || + !isDriveValid(drive, image, this.props.write) || + (this.props.write && drive.isReadOnly) + ); + } + + private getDisplayedDrives(drives: Drive[]): Drive[] { + return drives.filter((drive) => { + return ( + isUsbbootDrive(drive) || + isDriverlessDrive(drive) || + isDriveSelected(drive.device) || + this.state.showSystemDrives || + !drive.isSystem + ); + }); + } + + private getDisabledDrives(drives: Drive[], image?: SourceMetadata): string[] { + return drives + .filter((drive) => this.driveShouldBeDisabled(drive, image)) + .map((drive) => drive.displayName); + } + + private renderProgress(progress: number) { + return ( + + Initializing device + + + ); + } + + private warningFromStatus( + status: string, + drive: { device: string; size: number }, + ) { + switch (status) { + case compatibility.containsImage(): + return warning.sourceDrive(); + case compatibility.largeDrive(): + return warning.largeDriveSize(); + case compatibility.system(): + return warning.systemDrive(); + case compatibility.tooSmall(): + return warning.tooSmall( + { + size: + this.state.image?.recommendedDriveSize || + this.state.image?.size || + 0, + }, + drive, + ); + default: + return ''; + } + } + + private renderStatuses(drive: DrivelistDrive) { + const statuses: DriveStatus[] = getDriveImageCompatibilityStatuses( + drive, + this.state.image, + this.props.write, + ).slice(0, 2); + return ( + // the column render fn expects a single Element + <> + {statuses.map((status) => { + const badgeShade = badgeShadeFromStatus(status.message); + const warningMessage = this.warningFromStatus(status.message, { + device: drive.device, + size: drive.size || 0, + }); + return ( + + {status.message} + + ); + })} + + ); + } + + private installMissingDrivers(drive: DriverlessDrive) { + if (drive.link) { + this.setState({ missingDriversModal: { drive } }); + } + } + + componentDidMount() { + this.unsubscribe = store.subscribe(() => { + const drives = getDrives(); + const image = getImage(); + this.setState({ + drives, + image, + selectedList: + (this.props.updateSelectedList && this.props.updateSelectedList()) || + [], + }); + }); + } + + componentWillUnmount() { + this.unsubscribe?.(); + } + + render() { + const { cancel, done, ...props } = this.props; + const { selectedList, drives, image, missingDriversModal } = this.state; + + const displayedDrives = this.getDisplayedDrives(drives); + const disabledDrives = this.getDisabledDrives(drives, image); + const numberOfSystemDrives = drives.filter(isSystemDrive).length; + const numberOfDisplayedSystemDrives = + displayedDrives.filter(isSystemDrive).length; + const numberOfHiddenSystemDrives = + numberOfSystemDrives - numberOfDisplayedSystemDrives; + const hasSystemDrives = selectedList.filter(isSystemDrive).length; + const showWarnings = this.props.showWarnings && hasSystemDrives; + + return ( + + + {this.props.titleLabel} + + + {i18next.t('drives.find', { length: drives.length })} + + + } + titleDetails={{getDrives().length} found} + cancel={() => cancel(this.originalList)} + done={() => done(selectedList)} + action={i18next.t('drives.select', { select: selectedList.length })} + primaryButtonProps={{ + primary: !showWarnings, + warning: showWarnings, + disabled: !hasAvailableDrives(), + }} + {...props} + > + {!hasAvailableDrives() ? ( + + {this.props.emptyListIcon} + {this.props.emptyListLabel} + + ) : ( + <> + { + // noop + }} + checkedItems={selectedList} + checkedRowsNumber={selectedList.length} + multipleSelection={this.props.multipleSelection} + columns={this.tableColumns} + data={displayedDrives} + disabledRows={disabledDrives} + getRowClass={(row: Drive) => + isDrivelistDrive(row) && row.isSystem ? ['system'] : [] + } + rowKey="displayName" + onCheck={(rows) => { + if (rows == null) { + rows = []; + } + let newSelection = rows.filter(isDrivelistDrive); + if (this.props.multipleSelection) { + if (rows.length === 0) { + newSelection = []; + } + const deselecting = selectedList.filter( + (selected) => + newSelection.filter( + (row) => row.device === selected.device, + ).length === 0, + ); + const selecting = newSelection.filter( + (row) => + selectedList.filter( + (selected) => row.device === selected.device, + ).length === 0, + ); + deselecting.concat(selecting).forEach((row) => { + if (this.props.onSelect) { + this.props.onSelect(row); + } + }); + this.setState({ + selectedList: newSelection, + }); + return; + } + if (this.props.onSelect) { + this.props.onSelect(newSelection[newSelection.length - 1]); + } + this.setState({ + selectedList: newSelection.slice(newSelection.length - 1), + }); + }} + onRowClick={(row: Drive) => { + if ( + !isDrivelistDrive(row) || + this.driveShouldBeDisabled(row, image) + ) { + return; + } + if (this.props.onSelect) { + this.props.onSelect(row); + } + const index = selectedList.findIndex( + (d) => d.device === row.device, + ); + const newList = this.props.multipleSelection + ? [...selectedList] + : []; + if (index === -1) { + newList.push(row); + } else { + // Deselect if selected + newList.splice(index, 1); + } + this.setState({ + selectedList: newList, + }); + }} + /> + {numberOfHiddenSystemDrives > 0 && ( + this.setState({ showSystemDrives: true })} + > + + + + {i18next.t('drives.showHidden', { + num: numberOfHiddenSystemDrives, + })} + + + + )} + + )} + {this.props.showWarnings && hasSystemDrives ? ( + + {i18next.t('drives.systemDriveDanger')} + + ) : null} + + {missingDriversModal.drive !== undefined && ( + this.setState({ missingDriversModal: {} })} + done={() => { + try { + if (missingDriversModal.drive !== undefined) { + openExternal(missingDriversModal.drive.link); + } + } catch (error: any) { + logException(error); + } finally { + this.setState({ missingDriversModal: {} }); + } + }} + action={i18next.t('yesContinue')} + cancelButtonProps={{ + children: i18next.t('cancel'), + }} + children={ + missingDriversModal.drive.linkMessage || + i18next.t('drives.openInBrowser', { + link: missingDriversModal.drive.link, + }) + } + /> + )} + + ); + } +} diff --git a/lib/gui/app/components/drive-status-warning-modal/drive-status-warning-modal.tsx b/lib/gui/app/components/drive-status-warning-modal/drive-status-warning-modal.tsx new file mode 100644 index 0000000..b569358 --- /dev/null +++ b/lib/gui/app/components/drive-status-warning-modal/drive-status-warning-modal.tsx @@ -0,0 +1,83 @@ +import ExclamationTriangleSvg from '@fortawesome/fontawesome-free/svgs/solid/triangle-exclamation.svg'; +import * as React from 'react'; +import type { ModalProps } from 'rendition'; +import { Badge, Flex, Txt } from 'rendition'; +import { Modal, ScrollableFlex } from '../../styled-components'; +import { middleEllipsis } from '../../utils/middle-ellipsis'; + +import prettyBytes from 'pretty-bytes'; +import type { DriveWithWarnings } from '../../pages/main/Flash'; +import * as i18next from 'i18next'; + +const DriveStatusWarningModal = ({ + done, + cancel, + isSystem, + drivesWithWarnings, +}: ModalProps & { + isSystem: boolean; + drivesWithWarnings: DriveWithWarnings[]; +}) => { + let warningSubtitle = i18next.t('drives.largeDriveWarning'); + let warningCta = i18next.t('drives.largeDriveWarningMsg'); + + if (isSystem) { + warningSubtitle = i18next.t('drives.systemDriveWarning'); + warningCta = i18next.t('drives.systemDriveWarningMsg'); + } + return ( + + + + + + {i18next.t('warning')} + + + {warningSubtitle} + + {drivesWithWarnings.map((drive, i, array) => ( + <> + + {middleEllipsis(drive.description, 28)}{' '} + {drive.size && prettyBytes(drive.size) + ' '} + {drive.statuses[0].message} + + {i !== array.length - 1 ?
: null} + + ))} +
+ {warningCta} +
+
+ ); +}; + +export default DriveStatusWarningModal; diff --git a/lib/gui/app/components/finish/finish.tsx b/lib/gui/app/components/finish/finish.tsx new file mode 100644 index 0000000..414da88 --- /dev/null +++ b/lib/gui/app/components/finish/finish.tsx @@ -0,0 +1,123 @@ +/* + * Copyright 2019 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from 'react'; +import { Flex } from 'rendition'; +import { v4 as uuidV4 } from 'uuid'; + +import * as flashState from '../../models/flash-state'; +import * as selectionState from '../../models/selection-state'; +import * as settings from '../../models/settings'; +import { Actions, store } from '../../models/store'; +import { FlashAnother } from '../flash-another/flash-another'; +import type { FlashError } from '../flash-results/flash-results'; +import { FlashResults } from '../flash-results/flash-results'; +import { SafeWebview } from '../safe-webview/safe-webview'; + +function restart(goToMain: () => void) { + selectionState.deselectAllDrives(); + + // Reset the flashing workflow uuid + store.dispatch({ + type: Actions.SET_FLASHING_WORKFLOW_UUID, + data: uuidV4(), + }); + + goToMain(); +} + +async function getSuccessBannerURL() { + return ( + (await settings.get('successBannerURL')) ?? + 'https://efp.balena.io/success-banner?borderTop=false&darkBackground=true' + ); +} + +function FinishPage({ goToMain }: { goToMain: () => void }) { + const [webviewShowing, setWebviewShowing] = React.useState(false); + const [successBannerURL, setSuccessBannerURL] = React.useState(''); + (async () => { + setSuccessBannerURL(await getSuccessBannerURL()); + })(); + const flashResults = flashState.getFlashResults(); + const errors: FlashError[] = ( + store.getState().toJS().failedDeviceErrors || [] + ).map(([, error]: [string, FlashError]) => ({ + ...error, + })); + const { averageSpeed, blockmappedSize, bytesWritten, failed, size } = + flashState.getFlashState(); + const { + skip, + results = { + bytesWritten, + sourceMetadata: { + size, + blockmappedSize, + }, + averageFlashingSpeed: averageSpeed, + devices: { failed, successful: 0 }, + }, + } = flashResults; + return ( + + + + + { + restart(goToMain); + }} + /> + + {successBannerURL.length && ( + + )} + + ); +} + +export default FinishPage; diff --git a/lib/gui/app/components/flash-another/flash-another.tsx b/lib/gui/app/components/flash-another/flash-another.tsx new file mode 100644 index 0000000..c224631 --- /dev/null +++ b/lib/gui/app/components/flash-another/flash-another.tsx @@ -0,0 +1,32 @@ +/* + * Copyright 2019 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from 'react'; + +import { BaseButton } from '../../styled-components'; +import * as i18next from 'i18next'; + +export interface FlashAnotherProps { + onClick: () => void; +} + +export const FlashAnother = (props: FlashAnotherProps) => { + return ( + + {i18next.t('flash.another')} + + ); +}; diff --git a/lib/gui/app/components/flash-results/flash-results.tsx b/lib/gui/app/components/flash-results/flash-results.tsx new file mode 100644 index 0000000..716c7ac --- /dev/null +++ b/lib/gui/app/components/flash-results/flash-results.tsx @@ -0,0 +1,244 @@ +/* + * Copyright 2019 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import CircleSvg from '@fortawesome/fontawesome-free/svgs/solid/circle.svg'; +import CheckCircleSvg from '@fortawesome/fontawesome-free/svgs/solid/circle-check.svg'; +import TimesCircleSvg from '@fortawesome/fontawesome-free/svgs/solid/circle-xmark.svg'; +import * as React from 'react'; +import type { FlexProps, TableColumn } from 'rendition'; +import { Flex, Link, Txt } from 'rendition'; +import styled from 'styled-components'; + +import { progress } from '../../../../shared/messages'; +import { bytesToMegabytes } from '../../../../shared/units'; + +import FlashSvg from '../../../assets/flash.svg'; +import { getDrives } from '../../models/available-drives'; +import { resetState } from '../../models/flash-state'; +import * as selection from '../../models/selection-state'; +import { middleEllipsis } from '../../utils/middle-ellipsis'; +import { Modal, Table } from '../../styled-components'; +import * as i18next from 'i18next'; + +const ErrorsTable = styled((props) => {...props} />)` + &&& [data-display='table-head'], + &&& [data-display='table-body'] { + > [data-display='table-row'] { + > [data-display='table-cell'] { + &:first-child { + width: 30%; + } + + &:nth-child(2) { + width: 20%; + } + + &:last-child { + width: 50%; + } + } + } + } +`; +const DoneIcon = (props: { + skipped: boolean; + color: string; + allFailed: boolean; +}) => { + const svgProps = { + width: '28px', + fill: props.color, + style: { + marginTop: '-25px', + marginLeft: '13px', + zIndex: 1, + }, + }; + return props.allFailed && !props.skipped ? ( + + ) : ( + + ); +}; + +export interface FlashError extends Error { + description: string; + device: string; + code: string; +} + +function formattedErrors(errors: FlashError[]) { + return errors + .map((error) => `${error.device}: ${error.message || error.code}`) + .join('\n'); +} + +const columns: Array> = [ + { + field: 'description', + label: i18next.t('flash.target'), + }, + { + field: 'device', + label: i18next.t('flash.location'), + }, + { + field: 'message', + label: i18next.t('flash.error'), + render: (message: string, { code }: FlashError) => { + return message ?? code; + }, + }, +]; + +function getEffectiveSpeed(results: { + sourceMetadata: { + size: number; + blockmappedSize?: number; + }; + averageFlashingSpeed: number; +}) { + const flashedSize = + results.sourceMetadata.blockmappedSize ?? results.sourceMetadata.size; + const timeSpent = flashedSize / results.averageFlashingSpeed; + return results.sourceMetadata.size / timeSpent; +} + +export function FlashResults({ + goToMain, + image = '', + errors, + results, + skip, + ...props +}: { + goToMain: () => void; + image?: string; + errors: FlashError[]; + skip: boolean; + results: { + sourceMetadata: { + size: number; + blockmappedSize?: number; + }; + averageFlashingSpeed: number; + devices: { failed: number; successful: number }; + }; +} & FlexProps) { + const [showErrorsInfo, setShowErrorsInfo] = React.useState(false); + + const allFailed = !skip && results?.devices?.successful === 0; + const someFailed = results?.devices?.failed !== 0 || errors?.length !== 0; + const effectiveSpeed = bytesToMegabytes(getEffectiveSpeed(results)).toFixed( + 1, + ); + return ( + + + + + + {middleEllipsis(image, 24)} + + + {allFailed + ? i18next.t('flash.flashFailed') + : i18next.t('flash.flashCompleted')} + + {skip ? {i18next.t('flash.skip')} : null} + + + {results.devices.successful !== 0 ? ( + + + + {results.devices.successful} + + + {progress.successful(results.devices.successful)} + + + ) : null} + {errors.length !== 0 ? ( + + + + {errors.length} + + + {progress.failed(errors.length)} + + setShowErrorsInfo(true)}> + {i18next.t('flash.moreInfo')} + + + ) : null} + {!allFailed && ( + + {i18next.t('flash.speed', { speed: effectiveSpeed })} + + )} + + + {showErrorsInfo && ( + + + {i18next.t('failedTarget')} + + + } + action={i18next.t('failedRetry')} + cancel={() => setShowErrorsInfo(false)} + done={() => { + setShowErrorsInfo(false); + resetState(); + getDrives() + .map((drive) => { + selection.deselectDrive(drive.device); + return drive.device; + }) + .filter((driveDevice) => + errors.some((error) => error.device === driveDevice), + ) + .forEach((driveDevice) => selection.selectDrive(driveDevice)); + goToMain(); + }} + > + +
+ )} + + ); +} diff --git a/lib/gui/app/components/progress-button/progress-button.tsx b/lib/gui/app/components/progress-button/progress-button.tsx new file mode 100644 index 0000000..0986bee --- /dev/null +++ b/lib/gui/app/components/progress-button/progress-button.tsx @@ -0,0 +1,136 @@ +/* + * Copyright 2016 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from 'react'; +import { Flex, Button, ProgressBar, Txt } from 'rendition'; +import { default as styled } from 'styled-components'; + +import { fromFlashState } from '../../modules/progress-status'; +import { StepButton } from '../../styled-components'; +import * as i18next from 'i18next'; + +const FlashProgressBar = styled(ProgressBar)` + > div { + width: 100%; + height: 12px; + color: white !important; + text-shadow: none !important; + transition-duration: 0s; + + > div { + transition-duration: 0s; + } + } + + width: 100%; + height: 12px; + margin-bottom: 6px; + border-radius: 14px; + font-size: 16px; + line-height: 48px; + + background: #2f3033; +`; + +interface ProgressButtonProps { + type: 'decompressing' | 'flashing' | 'verifying'; + active: boolean; + percentage: number; + position: number; + disabled: boolean; + cancel: (type: string) => void; + callback: () => void; + warning?: boolean; +} + +const colors = { + decompressing: '#00aeef', + flashing: '#da60ff', + verifying: '#1ac135', +} as const; + +const CancelButton = styled(({ type, onClick, ...props }) => { + const status = type === 'verifying' ? i18next.t('skip') : i18next.t('cancel'); + return ( + + ); +})` + font-weight: 600; + + &&& { + width: auto; + height: auto; + font-size: 14px; + } +`; + +export class ProgressButton extends React.PureComponent { + public render() { + const percentage = this.props.percentage; + const warning = this.props.warning; + const { status, position } = fromFlashState({ + type: this.props.type, + percentage, + position: this.props.position, + }); + const type = this.props.type || 'default'; + if (this.props.active) { + return ( + <> + + + {status}  + {position} + + {type && ( + + )} + + + + ); + } + return ( + + {i18next.t('flash.flashNow')} + + ); + } +} diff --git a/lib/gui/app/components/reduced-flashing-infos/reduced-flashing-infos.tsx b/lib/gui/app/components/reduced-flashing-infos/reduced-flashing-infos.tsx new file mode 100644 index 0000000..c880d8a --- /dev/null +++ b/lib/gui/app/components/reduced-flashing-infos/reduced-flashing-infos.tsx @@ -0,0 +1,74 @@ +/* + * Copyright 2016 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from 'react'; +import { Flex, Txt } from 'rendition'; + +import DriveSvg from '../../../assets/drive.svg'; +import ImageSvg from '../../../assets/image.svg'; +import { SVGIcon } from '../svg-icon/svg-icon'; +import { middleEllipsis } from '../../utils/middle-ellipsis'; + +interface ReducedFlashingInfosProps { + imageLogo?: string; + imageName?: string; + imageSize: string; + driveTitle: string; + driveLabel: string; + style?: React.CSSProperties; +} + +export class ReducedFlashingInfos extends React.Component { + constructor(props: ReducedFlashingInfosProps) { + super(props); + this.state = {}; + } + + public render() { + const { imageName = '' } = this.props; + return ( + + + + + {middleEllipsis(imageName, 16)} + + {this.props.imageSize} + + + + + + {middleEllipsis(this.props.driveTitle, 16)} + + + + ); + } +} diff --git a/lib/gui/app/components/safe-webview/safe-webview.tsx b/lib/gui/app/components/safe-webview/safe-webview.tsx new file mode 100644 index 0000000..efe8ae3 --- /dev/null +++ b/lib/gui/app/components/safe-webview/safe-webview.tsx @@ -0,0 +1,206 @@ +/* + * Copyright 2017 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as electron from 'electron'; +import * as remote from '@electron/remote'; +import * as _ from 'lodash'; +import * as React from 'react'; + +import * as packageJSON from '../../../../../package.json'; +import * as settings from '../../models/settings'; + +/** + * @summary Electron session identifier + */ +const ELECTRON_SESSION = 'persist:success-banner'; + +/** + * @summary Etcher version search-parameter key + */ +const ETCHER_VERSION_PARAM = 'etcher-version'; + +/** + * @summary API version search-parameter key + */ +const API_VERSION_PARAM = 'api-version'; + +/** + * @summary Opt-out analytics search-parameter key + */ +const OPT_OUT_ANALYTICS_PARAM = 'optOutAnalytics'; + +/** + * @summary Webview API version + * + * @description + * Changing this number represents a departure from an older API and as such + * should only be changed when truly necessary as it introduces breaking changes. + * This version number is exposed to the banner such that it can determine what + * features are safe to utilize. + * + * See `git blame -L n` where n is the line below for the history of version changes. + */ +const API_VERSION = '2'; + +interface SafeWebviewProps { + // The website source URL + src: string; + // Webview lifecycle event + onWebviewShow?: (isWebviewShowing: boolean) => void; + style?: React.CSSProperties; +} + +interface SafeWebviewState { + shouldShow: boolean; +} + +/** + * @summary Webviews that hide/show depending on the HTTP status returned + */ +export class SafeWebview extends React.PureComponent< + SafeWebviewProps, + SafeWebviewState +> { + private entryHref: string; + private session: electron.Session; + private webviewRef: React.RefObject; + + constructor(props: SafeWebviewProps) { + super(props); + this.webviewRef = React.createRef(); + this.state = { + shouldShow: true, + }; + const url = new window.URL(this.props.src); + // We set the version GET parameters here. + url.searchParams.set(ETCHER_VERSION_PARAM, packageJSON.version); + url.searchParams.set(API_VERSION_PARAM, API_VERSION); + url.searchParams.set( + OPT_OUT_ANALYTICS_PARAM, + (!settings.getSync('errorReporting')).toString(), + ); + this.entryHref = url.href; + // Events steal 'this' + this.handleDomReady = _.bind(this.handleDomReady, this); + this.didFailLoad = _.bind(this.didFailLoad, this); + this.didGetResponseDetails = _.bind(this.didGetResponseDetails, this); + // Make a persistent electron session for the webview + this.session = remote.session.fromPartition(ELECTRON_SESSION, { + // Disable the cache for the session such that new content shows up when refreshing + cache: false, + }); + } + + private static logWebViewMessage(event: electron.ConsoleMessageEvent) { + console.log('Message from SafeWebview:', event.message); + } + + public render() { + const { + style = { + flex: this.state.shouldShow ? undefined : '0 1', + width: this.state.shouldShow ? undefined : '0', + height: this.state.shouldShow ? undefined : '0', + }, + } = this.props; + return ( + + ); + } + + // Add the Webview events + public componentDidMount() { + // Events React is unaware of have to be handled manually + if (this.webviewRef.current !== null) { + this.webviewRef.current.addEventListener( + 'did-fail-load', + this.didFailLoad, + ); + this.webviewRef.current.addEventListener( + 'dom-ready', + this.handleDomReady, + ); + this.webviewRef.current.addEventListener( + 'console-message', + SafeWebview.logWebViewMessage, + ); + this.session.webRequest.onCompleted(this.didGetResponseDetails); + // It's important that this comes after the partition setting, otherwise it will + // use another session and we can't change it without destroying the element again + this.webviewRef.current.src = this.entryHref; + } + } + + // Remove the Webview events + public componentWillUnmount() { + // Events that React is unaware of have to be handled manually + if (this.webviewRef.current !== null) { + this.webviewRef.current.removeEventListener( + 'did-fail-load', + this.didFailLoad, + ); + this.webviewRef.current.removeEventListener( + 'dom-ready', + this.handleDomReady, + ); + this.webviewRef.current.removeEventListener( + 'console-message', + SafeWebview.logWebViewMessage, + ); + } + this.session.webRequest.onCompleted(null); + } + + handleDomReady() { + const webview = this.webviewRef.current; + if (webview == null) { + return; + } + const id = webview.getWebContentsId(); + electron.ipcRenderer.send('webview-dom-ready', id); + } + + // Set the element state to hidden + public didFailLoad() { + this.setState({ + shouldShow: false, + }); + if (this.props.onWebviewShow) { + this.props.onWebviewShow(false); + } + } + + // Set the element state depending on the HTTP response code + public didGetResponseDetails(event: electron.OnCompletedListenerDetails) { + // This seems to pick up all requests related to the webview, + // only care about this event if it's a request for the main frame + if (event.resourceType === 'mainFrame') { + const HTTP_OK = 200; + this.setState({ + shouldShow: event.statusCode === HTTP_OK, + }); + if (this.props.onWebviewShow) { + this.props.onWebviewShow(event.statusCode === HTTP_OK); + } + } + } +} diff --git a/lib/gui/app/components/settings/settings.tsx b/lib/gui/app/components/settings/settings.tsx new file mode 100644 index 0000000..50d73f8 --- /dev/null +++ b/lib/gui/app/components/settings/settings.tsx @@ -0,0 +1,156 @@ +/* + * Copyright 2019 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import GithubSvg from '@fortawesome/fontawesome-free/svgs/brands/github.svg'; +import * as _ from 'lodash'; +import * as React from 'react'; +import { Box, Checkbox, Flex, Txt } from 'rendition'; + +import { version, packageType } from '../../../../../package.json'; +import * as settings from '../../models/settings'; +import { open as openExternal } from '../../os/open-external/services/open-external'; +import { Modal } from '../../styled-components'; +import * as i18next from 'i18next'; +import { etcherProInfo } from '../../utils/etcher-pro-specific'; + +interface Setting { + name: string; + label: string | JSX.Element; +} + +async function getSettingsList(): Promise { + const list: Setting[] = [ + { + name: 'errorReporting', + label: i18next.t('settings.errorReporting'), + }, + { + name: 'autoBlockmapping', + label: i18next.t('settings.trimExtPartitions'), + }, + ]; + if (['appimage', 'nsis', 'dmg'].includes(packageType)) { + list.push({ + name: 'updatesEnabled', + label: i18next.t('settings.autoUpdate'), + }); + } + return list; +} + +interface SettingsModalProps { + toggleModal: (value: boolean) => void; +} + +const EPInfo = etcherProInfo(); + +const InfoBox = (props: any) => ( + + {props.label} + + {props.value}{' '} + + +); + +export function SettingsModal({ toggleModal }: SettingsModalProps) { + const [settingsList, setCurrentSettingsList] = React.useState([]); + React.useEffect(() => { + (async () => { + if (settingsList.length === 0) { + setCurrentSettingsList(await getSettingsList()); + } + })(); + }); + const [currentSettings, setCurrentSettings] = React.useState< + _.Dictionary + >({}); + React.useEffect(() => { + (async () => { + if (_.isEmpty(currentSettings)) { + setCurrentSettings(await settings.getAll()); + } + })(); + }); + + const toggleSetting = async (setting: string) => { + const value = currentSettings[setting]; + await settings.set(setting, !value); + setCurrentSettings({ + ...currentSettings, + [setting]: !value, + }); + }; + + return ( + + {i18next.t('settings.settings')} + + } + done={() => toggleModal(false)} + > + + {settingsList.map((setting: Setting, i: number) => { + return ( + + toggleSetting(setting.name)} + /> + + ); + })} + {EPInfo !== undefined && ( + + {i18next.t('settings.systemInformation')} + {EPInfo.get_serial() === undefined ? ( + + ) : ( + + )} + + )} + + openExternal( + 'https://github.com/balena-io/etcher/blob/master/CHANGELOG.md', + ) + } + > + + {version} + + + + ); +} diff --git a/lib/gui/app/components/source-selector/source-selector.tsx b/lib/gui/app/components/source-selector/source-selector.tsx new file mode 100644 index 0000000..00e7cf0 --- /dev/null +++ b/lib/gui/app/components/source-selector/source-selector.tsx @@ -0,0 +1,785 @@ +/* + * Copyright 2016 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import CopySvg from '@fortawesome/fontawesome-free/svgs/solid/copy.svg'; +import FileSvg from '@fortawesome/fontawesome-free/svgs/solid/file.svg'; +import LinkSvg from '@fortawesome/fontawesome-free/svgs/solid/link.svg'; +import ExclamationTriangleSvg from '@fortawesome/fontawesome-free/svgs/solid/triangle-exclamation.svg'; +import ChevronDownSvg from '@fortawesome/fontawesome-free/svgs/solid/chevron-down.svg'; +import ChevronRightSvg from '@fortawesome/fontawesome-free/svgs/solid/chevron-right.svg'; +import type { IpcRendererEvent } from 'electron'; +import { ipcRenderer } from 'electron'; +import { uniqBy, isNil } from 'lodash'; +import * as path from 'path'; +import prettyBytes from 'pretty-bytes'; +import * as React from 'react'; +import { requestMetadata } from '../../app'; + +import type { ButtonProps } from 'rendition'; +import { + Flex, + Modal as SmallModal, + Txt, + Card as BaseCard, + Input, + Spinner, + Link, +} from 'rendition'; +import styled from 'styled-components'; + +import * as errors from '../../../../shared/errors'; +import * as messages from '../../../../shared/messages'; +import * as supportedFormats from '../../../../shared/supported-formats'; +import * as selectionState from '../../models/selection-state'; +import { observe } from '../../models/store'; +import * as analytics from '../../modules/analytics'; +import * as exceptionReporter from '../../modules/exception-reporter'; +import * as osDialog from '../../os/dialog'; + +import { + ChangeButton, + DetailsText, + Modal, + StepButton, + StepNameButton, + ScrollableFlex, +} from '../../styled-components'; +import { colors } from '../../theme'; +import { middleEllipsis } from '../../utils/middle-ellipsis'; +import { SVGIcon } from '../svg-icon/svg-icon'; + +import ImageSvg from '../../../assets/image.svg'; +import SrcSvg from '../../../assets/src.svg'; +import { DriveSelector } from '../drive-selector/drive-selector'; +import type { DrivelistDrive } from '../../../../shared/drive-constraints'; +import { isJson } from '../../../../shared/utils'; +import type { + SourceMetadata, + Authentication, + Source, +} from '../../../../shared/typings/source-selector'; +import * as i18next from 'i18next'; + +const recentUrlImagesKey = 'recentUrlImages'; + +function normalizeRecentUrlImages(urls: any[]): URL[] { + if (!Array.isArray(urls)) { + urls = []; + } + urls = urls + .map((url) => { + try { + return new URL(url); + } catch (error: any) { + // Invalid URL, skip + } + }) + .filter((url) => url !== undefined); + urls = uniqBy(urls, (url) => url.href); + return urls.slice(urls.length - 5); +} + +function getRecentUrlImages(): URL[] { + let urls = []; + try { + urls = JSON.parse(localStorage.getItem(recentUrlImagesKey) || '[]'); + } catch { + // noop + } + return normalizeRecentUrlImages(urls); +} + +function setRecentUrlImages(urls: URL[]) { + const normalized = normalizeRecentUrlImages(urls.map((url: URL) => url.href)); + localStorage.setItem(recentUrlImagesKey, JSON.stringify(normalized)); +} + +const isURL = (imagePath: string) => + imagePath.startsWith('https://') || imagePath.startsWith('http://'); + +const Card = styled(BaseCard)` + hr { + margin: 5px 0; + } +`; + +// TODO move these styles to rendition +const ModalText = styled.p` + a { + color: rgb(0, 174, 239); + + &:hover { + color: rgb(0, 139, 191); + } + } +`; + +function getState() { + const image = selectionState.getImage(); + return { + hasImage: selectionState.hasImage(), + imageName: image?.name, + imageSize: image?.size, + }; +} + +function isString(value: any): value is string { + return typeof value === 'string'; +} + +const URLSelector = ({ + done, + cancel, +}: { + done: (imageURL: string, auth?: Authentication) => void; + cancel: () => void; +}) => { + const [imageURL, setImageURL] = React.useState(''); + const [recentImages, setRecentImages] = React.useState([]); + const [loading, setLoading] = React.useState(false); + const [showBasicAuth, setShowBasicAuth] = React.useState(false); + const [username, setUsername] = React.useState(''); + const [password, setPassword] = React.useState(''); + React.useEffect(() => { + const fetchRecentUrlImages = async () => { + const recentUrlImages: URL[] = await getRecentUrlImages(); + setRecentImages(recentUrlImages); + }; + fetchRecentUrlImages(); + }, []); + return ( + : i18next.t('ok')} + done={async () => { + setLoading(true); + const urlStrings = recentImages.map((url: URL) => url.href); + const normalizedRecentUrls = normalizeRecentUrlImages([ + ...urlStrings, + imageURL, + ]); + setRecentUrlImages(normalizedRecentUrls); + const auth = username ? { username, password } : undefined; + await done(imageURL, auth); + }} + > + + + + {i18next.t('source.useSourceURL')} + + ) => + setImageURL(evt.target.value) + } + /> + { + if (showBasicAuth) { + setUsername(''); + setPassword(''); + } + setShowBasicAuth(!showBasicAuth); + }} + > + + {showBasicAuth && ( + + )} + {!showBasicAuth && ( + + )} + {i18next.t('source.auth')} + + + {showBasicAuth && ( + + ) => + setUsername(evt.target.value) + } + /> + ) => + setPassword(evt.target.value) + } + /> + + )} + + {recentImages.length > 0 && ( + + Recent + + ( + { + setImageURL(recent.href); + }} + style={{ + overflowWrap: 'break-word', + }} + > + {recent.pathname.split('/').pop()} - {recent.href} + + )) + .reverse()} + /> + + + )} + + + ); +}; + +interface Flow { + icon?: JSX.Element; + onClick: (evt: React.MouseEvent) => void; + label: string; +} + +const FlowSelector = styled( + ({ flow, ...props }: { flow: Flow } & ButtonProps) => ( + ) => + flow.onClick(evt) + } + icon={flow.icon} + {...props} + > + {flow.label} + + ), +)` + border-radius: 24px; + color: rgba(255, 255, 255, 0.7); + + :enabled:focus, + :enabled:focus svg { + color: ${colors.primary.foreground} !important; + } + + :enabled:hover { + background-color: ${colors.primary.background}; + color: ${colors.primary.foreground}; + font-weight: 600; + + svg { + color: ${colors.primary.foreground} !important; + } + } +`; + +interface SourceSelectorProps { + flashing: boolean; + hideAnalyticsAlert: () => void; +} + +interface SourceSelectorState { + hasImage: boolean; + imageName?: string; + imageSize?: number; + warning: { message: string; title: string | null } | null; + showImageDetails: boolean; + showURLSelector: boolean; + showDriveSelector: boolean; + defaultFlowActive: boolean; + imageSelectorOpen: boolean; + imageLoading: boolean; +} + +export class SourceSelector extends React.Component< + SourceSelectorProps, + SourceSelectorState +> { + private unsubscribe: (() => void) | undefined; + + constructor(props: SourceSelectorProps) { + super(props); + this.state = { + ...getState(), + warning: null, + showImageDetails: false, + showURLSelector: false, + showDriveSelector: false, + defaultFlowActive: true, + imageSelectorOpen: false, + imageLoading: false, + }; + + // Bind `this` since it's used in an event's callback + this.onSelectImage = this.onSelectImage.bind(this); + } + + public componentDidMount() { + this.unsubscribe = observe(() => { + this.setState(getState()); + }); + ipcRenderer.on('select-image', this.onSelectImage); + ipcRenderer.send('source-selector-ready'); + } + + public componentWillUnmount() { + this.unsubscribe?.(); + ipcRenderer.removeListener('select-image', this.onSelectImage); + } + + public componentDidUpdate( + _prevProps: Readonly, + prevState: Readonly, + ) { + if ( + (!prevState.showDriveSelector && this.state.showDriveSelector) || + (!prevState.showURLSelector && this.state.showURLSelector) || + (!prevState.showImageDetails && this.state.showImageDetails) || + (!prevState.imageSelectorOpen && this.state.imageSelectorOpen) + ) { + this.props.hideAnalyticsAlert(); + } + } + + private async onSelectImage(_event: IpcRendererEvent, imagePath: string) { + this.setState({ imageLoading: true }); + await this.selectSource( + imagePath, + isURL(this.normalizeImagePath(imagePath)) ? 'Http' : 'File', + ).promise; + this.setState({ imageLoading: false }); + } + + public normalizeImagePath(imgPath: string) { + const decodedPath = decodeURIComponent(imgPath); + if (isJson(decodedPath)) { + return JSON.parse(decodedPath).url ?? decodedPath; + } + return decodedPath; + } + + private reselectSource() { + selectionState.deselectImage(); + this.props.hideAnalyticsAlert(); + } + + private selectSource( + selected: string | DrivelistDrive, + SourceType: Source, + auth?: Authentication, + ): { promise: Promise; cancel: () => void } { + return { + cancel: () => { + // noop + }, + promise: (async () => { + const sourcePath = isString(selected) ? selected : selected.device; + let metadata: SourceMetadata | undefined; + if (isString(selected)) { + if ( + SourceType === 'Http' && + !isURL(this.normalizeImagePath(selected)) + ) { + this.handleError( + i18next.t('source.unsupportedProtocol'), + selected, + messages.error.unsupportedProtocol(), + ); + return; + } + + if (supportedFormats.looksLikeWindowsImage(selected)) { + this.setState({ + warning: { + message: messages.warning.looksLikeWindowsImage(), + title: i18next.t('source.windowsImage'), + }, + }); + } + + try { + // this will send an event down the ipcMain asking for metadata + // we'll get the response through an event + + // FIXME: This is a poor man wait while loading to prevent a potential race condition without completely blocking the interface + // This should be addressed when refactoring the GUI + let retriesLeft = 10; + while (requestMetadata === undefined && retriesLeft > 0) { + await new Promise((resolve) => setTimeout(resolve, 1050)); // api is trying to connect every 1000, this is offset to make sure we fall between retries + retriesLeft--; + } + + metadata = await requestMetadata({ selected, SourceType, auth }); + + if (!metadata?.hasMBR && this.state.warning === null) { + this.setState({ + warning: { + message: messages.warning.missingPartitionTable(), + title: i18next.t('source.partitionTable'), + }, + }); + } + } catch (error: any) { + this.handleError( + i18next.t('source.errorOpen'), + sourcePath, + messages.error.openSource(sourcePath, error.message), + error, + ); + } + } else { + if (selected.partitionTableType === null) { + this.setState({ + warning: { + message: messages.warning.driveMissingPartitionTable(), + title: i18next.t('source.partitionTable'), + }, + }); + } + metadata = { + path: selected.device, + displayName: selected.displayName, + description: selected.displayName, + size: selected.size as SourceMetadata['size'], + SourceType: 'BlockDevice', + drive: selected, + }; + } + + if (metadata !== undefined) { + metadata.auth = auth; + metadata.SourceType = SourceType; + selectionState.selectSource(metadata); + } + })(), + }; + } + + private handleError( + title: string, + sourcePath: string, + description: string, + error?: Error, + ) { + const imageError = errors.createUserError({ + title, + description, + }); + osDialog.showError(imageError); + if (error) { + analytics.logException(error); + return; + } + } + + private async openImageSelector() { + this.setState({ imageSelectorOpen: true }); + + try { + const imagePath = await osDialog.selectImage(); + // Avoid analytics and selection state changes + // if no file was resolved from the dialog. + if (!imagePath) { + return; + } + await this.selectSource(imagePath, 'File').promise; + } catch (error: any) { + exceptionReporter.report(error); + } finally { + this.setState({ imageSelectorOpen: false }); + } + } + + private async onDrop(event: React.DragEvent) { + const file = event.dataTransfer.files.item(0); + if (file != null) { + await this.selectSource(file.path, 'File').promise; + } + } + + private openURLSelector() { + this.setState({ + showURLSelector: true, + }); + } + + private openDriveSelector() { + this.setState({ + showDriveSelector: true, + }); + } + + private onDragOver(event: React.DragEvent) { + // Needed to get onDrop events on div elements + event.preventDefault(); + } + + private onDragEnter(event: React.DragEvent) { + // Needed to get onDrop events on div elements + event.preventDefault(); + } + + private showSelectedImageDetails() { + this.setState({ + showImageDetails: true, + }); + } + + private setDefaultFlowActive(defaultFlowActive: boolean) { + this.setState({ defaultFlowActive }); + } + + private closeModal() { + this.setState({ + showDriveSelector: false, + }); + } + + // TODO add a visual change when dragging a file over the selector + public render() { + const { flashing } = this.props; + const { + showImageDetails, + showURLSelector, + showDriveSelector, + imageLoading, + } = this.state; + const selectionImage = selectionState.getImage(); + let image = + selectionImage !== undefined ? selectionImage : ({} as SourceMetadata); + + image = image.drive ?? image; + + let cancelURLSelection = () => { + // noop + }; + image.name = image.description || image.name; + const imagePath = image.path || image.displayName || ''; + const imageBasename = path.basename(imagePath); + const imageName = image.name || ''; + const imageSize = image.size; + const imageLogo = image.logo || ''; + + return ( + <> + ) => this.onDrop(evt)} + onDragEnter={(evt: React.DragEvent) => + this.onDragEnter(evt) + } + onDragOver={(evt: React.DragEvent) => + this.onDragOver(evt) + } + > + + + {selectionImage !== undefined || imageLoading ? ( + <> + this.showSelectedImageDetails()} + tooltip={imageName || imageBasename} + > + + {middleEllipsis(imageName || imageBasename, 20)} + + + {!flashing && !imageLoading && ( + this.reselectSource()} + > + {i18next.t('cancel')} + + )} + {!isNil(imageSize) && !imageLoading && ( + {prettyBytes(imageSize)} + )} + + ) : ( + <> + this.openImageSelector(), + label: i18next.t('source.fromFile'), + icon: , + }} + onMouseEnter={() => this.setDefaultFlowActive(false)} + onMouseLeave={() => this.setDefaultFlowActive(true)} + /> + this.openURLSelector(), + label: i18next.t('source.fromURL'), + icon: , + }} + onMouseEnter={() => this.setDefaultFlowActive(false)} + onMouseLeave={() => this.setDefaultFlowActive(true)} + /> + this.openDriveSelector(), + label: i18next.t('source.clone'), + icon: , + }} + onMouseEnter={() => this.setDefaultFlowActive(false)} + onMouseLeave={() => this.setDefaultFlowActive(true)} + /> + + )} + + + {this.state.warning != null && ( + + {' '} + {this.state.warning.title} + + } + action={i18next.t('continue')} + cancel={() => { + this.setState({ warning: null }); + this.reselectSource(); + }} + done={() => { + this.setState({ warning: null }); + }} + primaryButtonProps={{ warning: true, primary: false }} + > + + + )} + + {showImageDetails && ( + { + this.setState({ showImageDetails: false }); + }} + > + + {i18next.t('source.name')} + {imageName || imageBasename} + + + {i18next.t('source.path')} + {imagePath} + + + )} + + {showURLSelector && ( + { + cancelURLSelection(); + this.setState({ + showURLSelector: false, + }); + }} + done={async (imageURL: string, auth?: Authentication) => { + // Avoid analytics and selection state changes + // if no file was resolved from the dialog. + if (imageURL) { + let promise; + ({ promise, cancel: cancelURLSelection } = this.selectSource( + imageURL, + 'Http', + auth, + )); + await promise; + } + this.setState({ + showURLSelector: false, + }); + }} + /> + )} + + {showDriveSelector && ( + } + cancel={(originalList) => { + if (originalList.length) { + const originalSource = originalList[0]; + if (selectionImage?.drive?.device !== originalSource.device) { + this.selectSource(originalSource, 'BlockDevice'); + } + } else { + selectionState.deselectImage(); + } + this.closeModal(); + }} + done={() => this.closeModal()} + onSelect={(drive) => { + if (drive) { + if ( + selectionState.getImage()?.drive?.device === drive?.device + ) { + return selectionState.deselectImage(); + } + this.selectSource(drive, 'BlockDevice'); + } + }} + /> + )} + + ); + } +} diff --git a/lib/gui/app/components/svg-icon/svg-icon.tsx b/lib/gui/app/components/svg-icon/svg-icon.tsx new file mode 100644 index 0000000..3059fe8 --- /dev/null +++ b/lib/gui/app/components/svg-icon/svg-icon.tsx @@ -0,0 +1,74 @@ +/* + * Copyright 2018 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from 'react'; + +const domParser = new window.DOMParser(); + +const DEFAULT_SIZE = '40px'; + +/** + * @summary Try to parse SVG contents and return it data encoded + * + */ +function tryParseSVGContents(contents?: string): string | undefined { + if (contents === undefined) { + return; + } + const doc = domParser.parseFromString(contents, 'image/svg+xml'); + const parserError = doc.querySelector('parsererror'); + const svg = doc.querySelector('svg'); + if (!parserError && svg) { + return `data:image/svg+xml,${encodeURIComponent(svg.outerHTML)}`; + } +} + +interface SVGIconProps { + // Optional string representing the SVG contents to be tried + contents?: string; + // Fallback SVG element to show if `contents` is invalid/undefined + fallback: React.FunctionComponent>; + // SVG image width unit + width?: string; + // SVG image height unit + height?: string; + // Should the element visually appear grayed out and disabled? + disabled?: boolean; + style?: React.CSSProperties; +} + +/** + * @summary SVG element that takes file contents + */ +export class SVGIcon extends React.PureComponent { + public render() { + const svgData = tryParseSVGContents(this.props.contents); + const { width, height, style = {} } = this.props; + style.width = width || DEFAULT_SIZE; + style.height = height || DEFAULT_SIZE; + if (svgData !== undefined) { + return ( + + ); + } + const { fallback: FallbackSVG } = this.props; + return ; + } +} diff --git a/lib/gui/app/components/target-selector/target-selector-button.tsx b/lib/gui/app/components/target-selector/target-selector-button.tsx new file mode 100644 index 0000000..b2d6286 --- /dev/null +++ b/lib/gui/app/components/target-selector/target-selector-button.tsx @@ -0,0 +1,157 @@ +/* + * Copyright 2019 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import ExclamationTriangleSvg from '@fortawesome/fontawesome-free/svgs/solid/triangle-exclamation.svg'; +import * as React from 'react'; +import type { FlexProps } from 'rendition'; +import { Flex, Txt } from 'rendition'; + +import type { DriveStatus } from '../../../../shared/drive-constraints'; +import { getDriveImageCompatibilityStatuses } from '../../../../shared/drive-constraints'; +import { compatibility, warning } from '../../../../shared/messages'; +import prettyBytes from 'pretty-bytes'; +import { getImage, getSelectedDrives } from '../../models/selection-state'; +import { + ChangeButton, + DetailsText, + StepButton, + StepNameButton, +} from '../../styled-components'; +import { middleEllipsis } from '../../utils/middle-ellipsis'; +import * as i18next from 'i18next'; + +interface TargetSelectorProps { + targets: any[]; + disabled: boolean; + openDriveSelector: () => void; + reselectDrive: () => void; + flashing: boolean; + show: boolean; + tooltip: string; +} + +function getDriveWarning(status: DriveStatus) { + switch (status.message) { + case compatibility.containsImage(): + return warning.sourceDrive(); + case compatibility.largeDrive(): + return warning.largeDriveSize(); + case compatibility.system(): + return warning.systemDrive(); + default: + return ''; + } +} + +const DriveCompatibilityWarning = ({ + warnings, + ...props +}: { + warnings: string[]; +} & FlexProps) => { + const systemDrive = warnings.find( + (message) => message === warning.systemDrive(), + ); + return ( + + + + ); +}; + +export function TargetSelectorButton(props: TargetSelectorProps) { + const targets = getSelectedDrives(); + + if (targets.length === 1) { + const target = targets[0]; + const warnings = getDriveImageCompatibilityStatuses( + target, + getImage(), + true, + ).map(getDriveWarning); + return ( + <> + + {warnings.length > 0 && ( + + )} + {middleEllipsis(target.description, 20)} + + {!props.flashing && ( + + {i18next.t('target.change')} + + )} + {target.size != null && ( + {prettyBytes(target.size)} + )} + + ); + } + + if (targets.length > 1) { + const targetsTemplate = []; + for (const target of targets) { + const warnings = getDriveImageCompatibilityStatuses( + target, + getImage(), + true, + ).map(getDriveWarning); + targetsTemplate.push( + + {warnings.length > 0 ? ( + + ) : null} + {middleEllipsis(target.description, 14)} + {target.size != null && {prettyBytes(target.size)}} + , + ); + } + return ( + <> + + {targets.length} {i18next.t('target.targets')} + + {!props.flashing && ( + + {i18next.t('target.change')} + + )} + {targetsTemplate} + + ); + } + + return ( + 0 ? -1 : 2} + disabled={props.disabled} + onClick={props.openDriveSelector} + > + {i18next.t('target.selectTarget')} + + ); +} diff --git a/lib/gui/app/components/target-selector/target-selector.tsx b/lib/gui/app/components/target-selector/target-selector.tsx new file mode 100644 index 0000000..8a7f867 --- /dev/null +++ b/lib/gui/app/components/target-selector/target-selector.tsx @@ -0,0 +1,181 @@ +/* + * Copyright 2016 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from 'react'; +import { Flex, Txt } from 'rendition'; + +import type { DriveSelectorProps } from '../drive-selector/drive-selector'; +import { DriveSelector } from '../drive-selector/drive-selector'; +import { + getImage, + getSelectedDrives, + deselectDrive, + selectDrive, + deselectAllDrives, +} from '../../models/selection-state'; +import { observe } from '../../models/store'; +import { TargetSelectorButton } from './target-selector-button'; + +import TgtSvg from '../../../assets/tgt.svg'; +import DriveSvg from '../../../assets/drive.svg'; +import { warning } from '../../../../shared/messages'; +import type { DrivelistDrive } from '../../../../shared/drive-constraints'; +import * as i18next from 'i18next'; + +export const getDriveListLabel = () => { + return getSelectedDrives() + .map((drive: any) => { + return `${drive.description} (${drive.displayName})`; + }) + .join('\n'); +}; + +const getDriveSelectionStateSlice = () => ({ + driveListLabel: getDriveListLabel(), + targets: getSelectedDrives(), + image: getImage(), +}); + +export const TargetSelectorModal = ( + props: Omit< + DriveSelectorProps, + 'titleLabel' | 'emptyListLabel' | 'multipleSelection' | 'emptyListIcon' + >, +) => ( + } + showWarnings={true} + selectedList={getSelectedDrives()} + updateSelectedList={getSelectedDrives} + {...props} + /> +); + +export const selectAllTargets = (modalTargets: DrivelistDrive[]) => { + const selectedDrivesFromState = getSelectedDrives(); + const deselected = selectedDrivesFromState.filter( + (drive) => + !modalTargets.find((modalTarget) => modalTarget.device === drive.device), + ); + // deselect drives + deselected.forEach((drive) => { + deselectDrive(drive.device); + }); + // select drives + modalTargets.forEach((drive) => { + selectDrive(drive.device); + }); +}; + +interface TargetSelectorProps { + disabled: boolean; + hasDrive: boolean; + flashing: boolean; + hideAnalyticsAlert: () => void; +} + +export const TargetSelector = ({ + disabled, + hasDrive, + flashing, + hideAnalyticsAlert, +}: TargetSelectorProps) => { + // TODO: inject these from redux-connector + const [{ driveListLabel, targets }, setStateSlice] = React.useState( + getDriveSelectionStateSlice(), + ); + const [showTargetSelectorModal, setShowTargetSelectorModal] = + React.useState(false); + + React.useEffect(() => { + return observe(() => { + setStateSlice(getDriveSelectionStateSlice()); + }); + }, []); + + const hasSystemDrives = targets.some((target) => target.isSystem); + return ( + + + + { + setShowTargetSelectorModal(true); + hideAnalyticsAlert(); + }} + reselectDrive={() => { + setShowTargetSelectorModal(true); + }} + flashing={flashing} + targets={targets} + /> + + {hasSystemDrives ? ( + + Warning: {warning.systemDrive()} + + ) : null} + + {showTargetSelectorModal && ( + { + if (originalList.length) { + selectAllTargets(originalList); + } else { + deselectAllDrives(); + } + setShowTargetSelectorModal(false); + }} + done={(modalTargets) => { + if (modalTargets.length === 0) { + deselectAllDrives(); + } + setShowTargetSelectorModal(false); + }} + onSelect={(drive) => { + if ( + getSelectedDrives().find( + (selectedDrive) => selectedDrive.device === drive.device, + ) + ) { + return deselectDrive(drive.device); + } + selectDrive(drive.device); + }} + /> + )} + + ); +}; diff --git a/lib/gui/app/css/fonts/SourceSansPro-Regular.ttf b/lib/gui/app/css/fonts/SourceSansPro-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b422bf43226f3c5f8a7821b5bda8e8effae586b2 GIT binary patch literal 269108 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 Kife4pfAxO|Kpl1f literal 0 HcmV?d00001 diff --git a/lib/gui/app/css/fonts/SourceSansPro-SemiBold.ttf b/lib/gui/app/css/fonts/SourceSansPro-SemiBold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..2908e0d7821bfbeb22f5b86688db513c4f2734ae GIT binary patch literal 268280 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

%ZGa;+mEM5_Mh7SUOsJHn?*+4 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 div { + font-family: 'SourceSansPro', sans-serif; +} diff --git a/lib/gui/app/i18n.ts b/lib/gui/app/i18n.ts new file mode 100644 index 0000000..5809a6f --- /dev/null +++ b/lib/gui/app/i18n.ts @@ -0,0 +1,44 @@ +import * as i18next from 'i18next'; +import { initReactI18next } from 'react-i18next'; +import zh_CN_translation from './i18n/zh-CN'; +import zh_TW_translation from './i18n/zh-TW'; +import en_translation from './i18n/en'; + +export function langParser() { + if (process.env.LANG !== undefined) { + // Bypass mocha, where lang-detect don't works + return 'en'; + } + + const lang = Intl.DateTimeFormat().resolvedOptions().locale; + + switch (lang.substr(0, 2)) { + case 'zh': + if (lang === 'zh-CN' || lang === 'zh-SG') { + return 'zh-CN'; + } // Simplified Chinese + else { + return 'zh-TW'; + } // Traditional Chinese + default: + return lang.substr(0, 2); + } +} + +i18next.use(initReactI18next).init({ + lng: langParser(), + fallbackLng: 'en', + nonExplicitSupportedLngs: true, + interpolation: { + escapeValue: false, + }, + resources: { + 'zh-CN': zh_CN_translation, + 'zh-TW': zh_TW_translation, + en: en_translation, + }, +}); + +export const supportedLocales = ['en', 'zh']; + +export default i18next; diff --git a/lib/gui/app/i18n/README.md b/lib/gui/app/i18n/README.md new file mode 100644 index 0000000..1eb97aa --- /dev/null +++ b/lib/gui/app/i18n/README.md @@ -0,0 +1,23 @@ +# i18n + +## How it was done + +Using the open-source lib [i18next](https://www.i18next.com/). + +## How to add your own language + +1. Go to `lib/gui/app/i18n` and add a file named `xx.ts` (use the codes mentioned + in [the link](https://www.science.co.il/language/Locale-codes.php), and we support styles as `fr`, `de`, `es-ES` + and `pt-BR`) + . +2. Copy the content from an existing translation and start to translate. +3. Once done, go to `lib/gui/app/i18n.ts` and add a line of `import xx_translation from './i18n/xx'` after the + already-added imports and add `xx: xx_translation` in the `resources` section of `i18next.init()` function. +4. Now go to `lib/shared/catalina-sudo/` and copy the `sudo-askpass.osascript-en.js`, change it to + be `sudo-askpass.osascript-xx.js` and edit + the `'balenaEtcher needs privileged access in order to flash disks.\n\nType your password to allow this.'` line and + those `Ok`s and `Cancel`s to your own language. +5. If, your language has several variations when they are used in several countries/regions, such as `zh-CN` and `zh-TW` + , or `pt-BR` and `pt-PT`, edit + the `langParser()` in the `lib/gui/app/i18n.ts` file to meet your need. +6. Make a commit, and then a pull request on GitHub. \ No newline at end of file diff --git a/lib/gui/app/i18n/en.ts b/lib/gui/app/i18n/en.ts new file mode 100644 index 0000000..3e7c3fd --- /dev/null +++ b/lib/gui/app/i18n/en.ts @@ -0,0 +1,161 @@ +const translation = { + translation: { + continue: 'Continue', + ok: 'OK', + cancel: 'Cancel', + skip: 'Skip', + sure: "Yes, I'm sure", + warning: 'WARNING! ', + attention: 'Attention', + failed: 'Failed', + completed: 'Completed', + yesContinue: 'Yes, continue', + reallyExit: 'Are you sure you want to close Etcher?', + yesExit: 'Yes, quit', + progress: { + starting: 'Starting...', + decompressing: 'Decompressing...', + flashing: 'Flashing...', + finishing: 'Finishing...', + verifying: 'Validating...', + failing: 'Failed', + }, + message: { + sizeNotRecommended: 'Not recommended', + tooSmall: 'Too small', + locked: 'Locked', + system: 'System drive', + containsImage: 'Source drive', + largeDrive: 'Large drive', + sourceLarger: 'The selected source is {{byte}} larger than this drive.', + flashSucceed_one: 'Successful target', + flashSucceed_other: 'Successful targets', + flashFail_one: 'Failed target', + flashFail_other: 'Failed targets', + toDrive: 'to {{description}} ({{name}})', + toTarget_one: 'to {{num}} target', + toTarget_other: 'to {{num}} targets', + andFailTarget_one: 'and failed to be flashed to {{num}} target', + andFailTarget_other: 'and failed to be flashed to {{num}} targets', + succeedTo: '{{name}} was successfully flashed {{target}}', + exitWhileFlashing: + 'You are currently flashing a drive. Closing Etcher may leave your drive in an unusable state.', + looksLikeWindowsImage: + 'It looks like you are trying to burn a Windows image.\n\nUnlike other images, Windows images require special processing to be made bootable. We suggest you use a tool specially designed for this purpose, such as Rufus (Windows), WoeUSB (Linux), or Boot Camp Assistant (macOS).', + image: 'image', + drive: 'drive', + missingPartitionTable: + 'It looks like this is not a bootable {{type}}.\n\nThe {{type}} does not appear to contain a partition table, and might not be recognized or bootable by your device.', + largeDriveSize: + "This is a large drive! Make sure it doesn't contain files that you want to keep.", + systemDrive: + 'Selecting your system drive is dangerous and will erase your drive!', + sourceDrive: 'Contains the image you chose to flash', + noSpace: + 'Not enough space on the drive. Please insert larger one and try again.', + genericFlashError: + 'Something went wrong. If it is a compressed image, please check that the archive is not corrupted.\n{{error}}', + validation: + 'The write has been completed successfully but Etcher detected potential corruption issues when reading the image back from the drive. \n\nPlease consider writing the image to a different drive.', + openError: + 'Something went wrong while opening {{source}}.\n\nError: {{error}}', + flashError: 'Something went wrong while writing {{image}} {{targets}}.', + unplug: + "Looks like Etcher lost access to the drive. Did it get unplugged accidentally?\n\nSometimes this error is caused by faulty readers that don't provide stable access to the drive.", + cannotWrite: + 'Looks like Etcher is not able to write to this location of the drive. This error is usually caused by a faulty drive, reader, or port. \n\nPlease try again with another drive, reader, or port.', + childWriterDied: + 'The writer process ended unexpectedly. Please try again, and contact the Etcher team if the problem persists.', + badProtocol: 'Only http:// and https:// URLs are supported.', + }, + target: { + selectTarget: 'Select target', + plugTarget: 'Plug a target drive', + targets: 'Targets', + change: 'Change', + }, + source: { + useSourceURL: 'Use Image URL', + auth: 'Authentication', + username: 'Enter username', + password: 'Enter password', + unsupportedProtocol: 'Unsupported protocol', + windowsImage: 'Possible Windows image detected', + partitionTable: 'Missing partition table', + errorOpen: 'Error opening source', + fromFile: 'Flash from file', + fromURL: 'Flash from URL', + clone: 'Clone drive', + image: 'Image', + name: 'Name: ', + path: 'Path: ', + selectSource: 'Select source', + plugSource: 'Plug a source drive', + osImages: 'OS Images', + allFiles: 'All', + enterValidURL: 'Enter a valid URL', + }, + drives: { + name: 'Name', + size: 'Size', + location: 'Location', + find: '{{length}} found', + select: 'Select {{select}}', + showHidden: 'Show {{num}} hidden', + systemDriveDanger: + 'Selecting your system drive is dangerous and will erase your drive!', + openInBrowser: '`Etcher will open {{link}} in your browser`', + changeTarget: 'Change target', + largeDriveWarning: 'You are about to erase an unusually large drive', + largeDriveWarningMsg: + 'Are you sure the selected drive is not a storage drive?', + systemDriveWarning: "You are about to erase your computer's drives", + systemDriveWarningMsg: + 'Are you sure you want to flash your system drive?', + }, + flash: { + another: 'Flash another', + target: 'Target', + location: 'Location', + error: 'Error', + flash: 'Flash', + flashNow: 'Flash!', + skip: 'Validation has been skipped', + moreInfo: 'more info', + speedTip: + 'The speed is calculated by dividing the image size by the flashing time.\nDisk images with ext partitions flash faster as we are able to skip unused parts.', + speed: 'Effective speed: {{speed}} MB/s', + speedShort: '{{speed}} MB/s', + eta: 'ETA: {{eta}}', + failedTarget: 'Failed targets', + failedRetry: 'Retry failed targets', + flashFailed: 'Flash Failed.', + flashCompleted: 'Flash Completed!', + }, + settings: { + errorReporting: 'Anonymously report errors to balena.io', + autoUpdate: 'Auto-updates enabled', + settings: 'Settings', + systemInformation: 'System Information', + trimExtPartitions: + 'Trim unallocated space on raw images (in ext-type partitions)', + }, + menu: { + edit: 'Edit', + view: 'View', + devTool: 'Toggle Developer Tools', + window: 'Window', + help: 'Help', + pro: 'Etcher Pro', + website: 'Etcher Website', + issue: 'Report an issue', + about: 'About Etcher', + hide: 'Hide Etcher', + hideOthers: 'Hide Others', + unhide: 'Unhide All', + quit: 'Quit Etcher', + }, + }, +}; + +export default translation; diff --git a/lib/gui/app/i18n/zh-CN.ts b/lib/gui/app/i18n/zh-CN.ts new file mode 100644 index 0000000..621be1f --- /dev/null +++ b/lib/gui/app/i18n/zh-CN.ts @@ -0,0 +1,152 @@ +const translation = { + translation: { + ok: '好', + cancel: '取消', + continue: '继续', + skip: '跳过', + sure: '我确定', + warning: '请注意!', + attention: '请注意', + failed: '失败', + completed: '完毕', + yesExit: '是的,可以退出', + reallyExit: '真的要现在退出 Etcher 吗?', + yesContinue: '是的,继续', + progress: { + starting: '正在启动……', + decompressing: '正在解压……', + flashing: '正在烧录……', + finishing: '正在结束……', + verifying: '正在验证……', + failing: '失败……', + }, + message: { + sizeNotRecommended: '大小不推荐', + tooSmall: '空间太小', + locked: '被锁定', + system: '系统盘', + containsImage: '存放源镜像', + largeDrive: '很大的磁盘', + sourceLarger: '所选的镜像比目标盘大了 {{byte}} 比特。', + flashSucceed_one: '烧录成功', + flashSucceed_other: '烧录成功', + flashFail_one: '烧录失败', + flashFail_other: '烧录失败', + toDrive: '到 {{description}} ({{name}})', + toTarget_one: '到 {{num}} 个目标', + toTarget_other: '到 {{num}} 个目标', + andFailTarget_one: '并烧录失败了 {{num}} 个目标', + andFailTarget_other: '并烧录失败了 {{num}} 个目标', + succeedTo: '{{name}} 被成功烧录 {{target}}', + exitWhileFlashing: + '您当前正在刷机。 关闭 Etcher 可能会导致您的磁盘无法使用。', + looksLikeWindowsImage: + '看起来您正在尝试刻录 Windows 镜像。\n\n与其他镜像不同,Windows 镜像需要特殊处理才能使其可启动。 我们建议您使用专门为此目的设计的工具,例如 Rufus (Windows)、WoeUSB (Linux) 或 Boot Camp 助理 (macOS)。', + image: '镜像', + drive: '磁盘', + missingPartitionTable: + '看起来这不是一个可启动的{{type}}。\n\n这个{{type}}似乎不包含分区表,因此您的设备可能无法识别或无法正确启动。', + largeDriveSize: '这是个很大的磁盘!请检查并确认它不包含对您很重要的信息', + systemDrive: '选择系统盘很危险,因为这将会删除你的系统', + sourceDrive: '源镜像位于这个分区中', + noSpace: '磁盘空间不足。 请插入另一个较大的磁盘并重试。', + genericFlashError: + '出了点问题。如果源镜像曾被压缩过,请检查它是否已损坏。\n{{error}}', + validation: + '写入已成功完成,但 Etcher 在从磁盘读取镜像时检测到潜在的损坏问题。 \n\n请考虑将镜像写入其他磁盘。', + openError: '打开 {{source}} 时出错。\n\n错误信息: {{error}}', + flashError: '烧录 {{image}} {{targets}} 失败。', + unplug: + '看起来 Etcher 失去了对磁盘的连接。 它是不是被意外拔掉了?\n\n有时这个错误是因为读卡器出了故障。', + cannotWrite: + '看起来 Etcher 无法写入磁盘的这个位置。 此错误通常是由故障的磁盘、读取器或端口引起的。 \n\n请使用其他磁盘、读卡器或端口重试。', + childWriterDied: + '写入进程意外崩溃。请再试一次,如果问题仍然存在,请联系 Etcher 团队。', + badProtocol: '仅支持 http:// 和 https:// 开头的网址。', + }, + target: { + selectTarget: '选择目标磁盘', + plugTarget: '请插入目标磁盘', + targets: '个目标', + change: '更改', + }, + menu: { + edit: '编辑', + view: '视图', + devTool: '打开开发者工具', + window: '窗口', + help: '帮助', + pro: 'Etcher 专业版', + website: 'Etcher 的官网', + issue: '提交一个 issue', + about: '关于 Etcher', + hide: '隐藏 Etcher', + hideOthers: '隐藏其它窗口', + unhide: '取消隐藏', + quit: '退出 Etcher', + }, + source: { + useSourceURL: '使用镜像网络地址', + auth: '验证', + username: '输入用户名', + password: '输入密码', + unsupportedProtocol: '不支持的协议', + windowsImage: '这可能是 Windows 系统镜像', + partitionTable: '找不到分区表', + errorOpen: '打开源镜像时出错', + fromFile: '从文件烧录', + fromURL: '从在线地址烧录', + clone: '克隆磁盘', + image: '镜像信息', + name: '名称:', + path: '路径:', + selectSource: '选择源', + plugSource: '请插入源磁盘', + osImages: '系统镜像格式', + allFiles: '任何文件格式', + enterValidURL: '请输入一个正确的地址', + }, + drives: { + name: '名称', + size: '大小', + location: '位置', + find: '找到 {{length}} 个', + select: '选定 {{select}}', + showHidden: '显示 {{num}} 个隐藏的磁盘', + systemDriveDanger: '选择系统盘很危险,因为这将会删除你的系统!', + openInBrowser: 'Etcher 会在浏览器中打开 {{link}}', + changeTarget: '改变目标', + largeDriveWarning: '您即将擦除一个非常大的磁盘', + largeDriveWarningMsg: '您确定所选磁盘不是存储磁盘吗?', + systemDriveWarning: '您将要擦除系统盘', + systemDriveWarningMsg: '您确定要烧录到系统盘吗?', + }, + flash: { + another: '烧录另一目标', + target: '目标', + location: '位置', + error: '错误', + flash: '烧录', + flashNow: '现在烧录!', + skip: '跳过了验证', + moreInfo: '更多信息', + speedTip: + '通过将镜像大小除以烧录时间来计算速度。\n由于我们能够跳过未使用的部分,因此具有EXT分区的磁盘镜像烧录速度更快。', + speed: '速度:{{speed}} MB/秒', + speedShort: '{{speed}} MB/秒', + eta: '预计还需要:{{eta}}', + failedTarget: '失败的烧录目标', + failedRetry: '重试烧录失败目标', + flashFailed: '烧录失败。', + flashCompleted: '烧录成功!', + }, + settings: { + errorReporting: '匿名地向 balena.io 报告运行错误和使用统计', + autoUpdate: '自动更新', + settings: '软件设置', + systemInformation: '系统信息', + }, + }, +}; + +export default translation; diff --git a/lib/gui/app/i18n/zh-TW.ts b/lib/gui/app/i18n/zh-TW.ts new file mode 100644 index 0000000..d1a1620 --- /dev/null +++ b/lib/gui/app/i18n/zh-TW.ts @@ -0,0 +1,154 @@ +const translation = { + translation: { + continue: '繼續', + ok: '好', + cancel: '取消', + skip: '跳過', + sure: '我確定', + warning: '請注意!', + attention: '請注意', + failed: '失敗', + completed: '完成', + yesContinue: '是的,繼續', + reallyExit: '真的要現在結束 Etcher 嗎?', + yesExit: '是的,可以結束', + progress: { + starting: '正在啟動……', + decompressing: '正在解壓縮……', + flashing: '正在燒錄……', + finishing: '正在結束……', + verifying: '正在驗證……', + failing: '失敗……', + }, + message: { + sizeNotRecommended: '大小不建議', + tooSmall: '空間太小', + locked: '被鎖定', + system: '系統', + containsImage: '存放來源映像檔', + largeDrive: '很大的磁碟', + sourceLarger: '所選的映像檔比目標磁碟大了 {{byte}} 位元組。', + flashSucceed_one: '燒錄成功', + flashSucceed_other: '燒錄成功', + flashFail_one: '燒錄失敗', + flashFail_other: '燒錄失敗', + toDrive: '到 {{description}} ({{name}})', + toTarget_one: '到 {{num}} 個目標', + toTarget_other: '到 {{num}} 個目標', + andFailTarget_one: '並燒錄失敗了 {{num}} 個目標', + andFailTarget_other: '並燒錄失敗了 {{num}} 個目標', + succeedTo: '{{name}} 被成功燒錄 {{target}}', + exitWhileFlashing: + '您目前正在刷寫。關閉 Etcher 可能會導致您的磁碟無法使用。', + looksLikeWindowsImage: + '看起來您正在嘗試燒錄 Windows 映像檔。\n\n與其他映像檔不同,Windows 映像檔需要特殊處理才能使其可啟動。我們建議您使用專門為此目的設計的工具,例如 Rufus (Windows)、WoeUSB (Linux) 或 Boot Camp 助理 (macOS)。', + image: '映像檔', + drive: '磁碟', + missingPartitionTable: + '看起來這不是一個可啟動的{{type}}。\n\n這個{{type}}似乎不包含分割表,因此您的設備可能無法識別或無法正確啟動。', + largeDriveSize: + '這是個很大容量的磁碟!請檢查並確認它不包含對您來說存放很重要的資料', + systemDrive: '選擇系統分割區很危險,因為這將會刪除你的系統', + sourceDrive: '來源映像檔位於這個分割區中', + noSpace: '磁碟空間不足。請插入另一個較大的磁碟並重試。', + genericFlashError: + '出了點問題。如果來源映像檔曾被壓縮過,請檢查它是否已損壞。\n{{error}}', + validation: + '寫入已成功完成,但 Etcher 在從磁碟讀取映像檔時檢測到潛在的損壞問題。\n\n請考慮將映像檔寫入其他磁碟。', + openError: '打開 {{source}} 時發生錯誤。\n\n錯誤訊息: {{error}}', + flashError: '燒錄 {{image}} {{targets}} 失敗。', + unplug: + '看起來 Etcher 失去了對磁碟的連接。是不是被意外拔掉了?\n\n有時這個錯誤是因為讀卡器出了故障。', + cannotWrite: + '看起來 Etcher 無法寫入磁碟的這個位置。此錯誤通常是由故障的磁碟、讀取器或連接埠引起的。\n\n請使用其他磁碟、讀卡器或連接埠重試。', + childWriterDied: + '寫入處理程序意外崩潰。請再試一次,如果問題仍然存在,請聯絡 Etcher 團隊。', + badProtocol: '僅支援 http:// 和 https:// 開頭的網址。', + }, + target: { + selectTarget: '選擇目標磁碟', + plugTarget: '請插入目標磁碟', + targets: '個目標', + change: '更改', + }, + source: { + useSourceURL: '使用映像檔網址', + auth: '驗證', + username: '輸入使用者名稱', + password: '輸入密碼', + unsupportedProtocol: '不支持的通訊協定', + windowsImage: '這可能是 Windows 系統映像檔', + partitionTable: '找不到分割表', + errorOpen: '打開來源映像檔時出錯', + fromFile: '從檔案燒錄', + fromURL: '從網址燒錄', + clone: '再製磁碟', + image: '映像檔訊息', + name: '名稱:', + path: '路徑:', + selectSource: '選擇來源', + plugSource: '請插入來源磁碟', + osImages: '系統映像檔格式', + allFiles: '任何檔案格式', + enterValidURL: '請輸入正確的網址', + }, + drives: { + name: '名稱', + size: '大小', + location: '位置', + find: '找到 {{length}} 個', + select: '選取 {{select}}', + showHidden: '顯示 {{num}} 個隱藏的磁碟', + systemDriveDanger: '選擇系統分割區很危險,因為這將會刪除你的系統!', + openInBrowser: 'Etcher 會在瀏覽器中打開 {{link}}', + changeTarget: '更改目標', + largeDriveWarning: '您即將格式化一個非常大的磁碟', + largeDriveWarningMsg: '您確定所選磁碟不是儲存資料的磁碟嗎?', + systemDriveWarning: '您將要格式化系統分割區', + systemDriveWarningMsg: '您確定要燒錄到系統分割區嗎?', + }, + flash: { + another: '燒錄另一目標', + target: '目標', + location: '位置', + error: '錯誤', + flash: '燒錄', + flashNow: '現在燒錄!', + skip: '跳過了驗證', + moreInfo: '更多資訊', + speedTip: + '透過將映像檔大小除以燒錄時間來計算速度。\n由於我們能夠跳過未使用的部分,因此具有 ext 分割區的磁碟映像檔燒錄速度更快。', + speed: '速度:{{speed}} MB/秒', + speedShort: '{{speed}} MB/秒', + eta: '預計還需要:{{eta}}', + failedTarget: '目標燒錄失敗', + failedRetry: '重試燒錄失敗的目標', + flashFailed: '燒錄失敗。', + flashCompleted: '燒錄成功!', + }, + settings: { + errorReporting: '匿名向 balena.io 回報程式錯誤和使用統計資料', + autoUpdate: '自動更新', + settings: '軟體設定', + systemInformation: '系統資訊', + trimExtPartitions: '修改原始映像檔上未分配的空間(在 ext 類型分割區中)', + }, + menu: { + edit: '編輯', + view: '預覽', + devTool: '打開開發者工具', + window: '視窗', + help: '協助', + pro: 'Etcher 專業版', + website: 'Etcher 的官網', + issue: '提交 issue', + about: '關於 Etcher', + hide: '隱藏 Etcher', + hideOthers: '隱藏其它視窗', + unhide: '取消隱藏', + quit: '結束 Etcher', + }, + }, +}; + +export default translation; diff --git a/lib/gui/app/index.html b/lib/gui/app/index.html new file mode 100644 index 0000000..253de89 --- /dev/null +++ b/lib/gui/app/index.html @@ -0,0 +1,10 @@ + + + + + balenaEtcher + + +

+ + diff --git a/lib/gui/app/models/available-drives.ts b/lib/gui/app/models/available-drives.ts new file mode 100644 index 0000000..3eab78d --- /dev/null +++ b/lib/gui/app/models/available-drives.ts @@ -0,0 +1,33 @@ +/* + * Copyright 2016 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { DrivelistDrive } from '../../../shared/drive-constraints'; +import { Actions, store } from './store'; + +export function hasAvailableDrives() { + return getDrives().length > 0; +} + +export function setDrives(drives: any[]) { + store.dispatch({ + type: Actions.SET_AVAILABLE_TARGETS, + data: drives, + }); +} + +export function getDrives(): DrivelistDrive[] { + return store.getState().toJS().availableDrives; +} diff --git a/lib/gui/app/models/flash-state.ts b/lib/gui/app/models/flash-state.ts new file mode 100644 index 0000000..e0a6daf --- /dev/null +++ b/lib/gui/app/models/flash-state.ts @@ -0,0 +1,162 @@ +/* + * Copyright 2016 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as electron from 'electron'; +import type * as sdk from 'etcher-sdk'; +import * as _ from 'lodash'; +import type { DrivelistDrive } from '../../../shared/drive-constraints'; +import { bytesToMegabytes } from '../../../shared/units'; +import { Actions, store } from './store'; + +/** + * @summary Reset flash state + */ +export function resetState() { + store.dispatch({ + type: Actions.RESET_FLASH_STATE, + data: {}, + }); +} + +/** + * @summary Check if currently flashing + */ +export function isFlashing(): boolean { + return store.getState().toJS().isFlashing; +} + +/** + * @summary Set the flashing flag + * + * @description + * The flag is used to signify that we're going to + * start a flash process. + */ +export function setFlashingFlag() { + // see https://github.com/balenablocks/balena-electron-env/blob/4fce9c461f294d4a768db8f247eea6f75d7b08b0/README.md#remote-methods + electron.ipcRenderer.send('disable-screensaver'); + store.dispatch({ + type: Actions.SET_FLASHING_FLAG, + data: {}, + }); +} + +/** + * @summary Unset the flashing flag + * + * @description + * The flag is used to signify that the write process ended. + */ +export function unsetFlashingFlag(results: { + cancelled?: boolean; + sourceChecksum?: string; + errorCode?: string | number; +}) { + store.dispatch({ + type: Actions.UNSET_FLASHING_FLAG, + data: results, + }); + // see https://github.com/balenablocks/balena-electron-env/blob/4fce9c461f294d4a768db8f247eea6f75d7b08b0/README.md#remote-methods + + electron.ipcRenderer.send('enable-screensaver'); +} + +export function setDevicePaths(devicePaths: string[]) { + store.dispatch({ + type: Actions.SET_DEVICE_PATHS, + data: devicePaths, + }); +} + +export function addFailedDeviceError({ + device, + error, +}: { + device: DrivelistDrive; + error: Error; +}) { + const failedDeviceErrorsMap = new Map( + store.getState().toJS().failedDeviceErrors, + ); + if (failedDeviceErrorsMap.has(device.device)) { + // Only store the first error + return; + } + failedDeviceErrorsMap.set(device.device, { + description: device.description, + device: device.device, + devicePath: device.devicePath, + ...error, + }); + store.dispatch({ + type: Actions.SET_FAILED_DEVICE_ERRORS, + data: Array.from(failedDeviceErrorsMap), + }); +} + +/** + * @summary Set the flashing state + */ +export function setProgressState( + state: sdk.multiWrite.MultiDestinationProgress, +) { + // Preserve only one decimal place + const PRECISION = 1; + const data = { + ...state, + percentage: + state.percentage !== undefined && _.isFinite(state.percentage) + ? Math.floor(state.percentage) + : undefined, + + speed: _.attempt(() => { + if (_.isFinite(state.speed)) { + return _.round(bytesToMegabytes(state.speed), PRECISION); + } + + return null; + }), + }; + + store.dispatch({ + type: Actions.SET_FLASH_STATE, + data, + }); +} + +export function getFlashResults() { + return store.getState().toJS().flashResults; +} + +export function getFlashState() { + return store.getState().get('flashState').toJS(); +} + +export function wasLastFlashCancelled() { + return _.get(getFlashResults(), ['cancelled'], false); +} + +export function getLastFlashSourceChecksum(): string { + return getFlashResults().sourceChecksum; +} + +export function getLastFlashErrorCode() { + return getFlashResults().errorCode; +} + +export function getFlashUuid() { + return store.getState().toJS().flashUuid; +} diff --git a/lib/gui/app/models/leds.ts b/lib/gui/app/models/leds.ts new file mode 100644 index 0000000..0a47802 --- /dev/null +++ b/lib/gui/app/models/leds.ts @@ -0,0 +1,259 @@ +/* + * Copyright 2020 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as _ from 'lodash'; +import type { AnimationFunction, Color } from 'sys-class-rgb-led'; +import { Animator, RGBLed } from 'sys-class-rgb-led'; + +import type { DrivelistDrive } from '../../../shared/drive-constraints'; +import { isSourceDrive } from '../../../shared/drive-constraints'; +import { getDrives } from './available-drives'; +import { getSelectedDrives } from './selection-state'; +import * as settings from './settings'; +import { observe, store } from './store'; + +const leds: Map = new Map(); +const animator = new Animator([], 10); + +function createAnimationFunction( + intensityFunction: (t: number) => number, + color: Color, +): AnimationFunction { + return (t: number): Color => { + const intensity = intensityFunction(t); + return color.map((v: number) => v * intensity) as Color; + }; +} + +function blink(t: number) { + return Math.floor(t) % 2; +} + +function one() { + return 1; +} + +type LEDColors = { + green: Color; + purple: Color; + red: Color; + blue: Color; + white: Color; + black: Color; +}; + +type LEDAnimationFunctions = { + blinkGreen: AnimationFunction; + blinkPurple: AnimationFunction; + staticRed: AnimationFunction; + staticGreen: AnimationFunction; + staticBlue: AnimationFunction; + staticWhite: AnimationFunction; + staticBlack: AnimationFunction; +}; + +let ledColors: LEDColors; +let ledAnimationFunctions: LEDAnimationFunctions; + +interface LedsState { + step: 'main' | 'flashing' | 'verifying' | 'finish'; + sourceDrive: string | undefined; + availableDrives: string[]; + selectedDrives: string[]; + failedDrives: string[]; +} + +function setLeds(animation: AnimationFunction, drivesPaths: Set) { + const rgbLeds: RGBLed[] = []; + for (const path of drivesPaths) { + const led = leds.get(path); + if (led) { + rgbLeds.push(led); + } + } + return { animation, rgbLeds }; +} + +// Source slot (1st slot): behaves as a target unless it is chosen as source +// No drive: black +// Drive plugged: blue - on +// +// Other slots (2 - 16): +// +// +----------------+---------------+-----------------------------+----------------------------+---------------------------------+ +// | | main screen | flashing | validating | results screen | +// +----------------+---------------+-----------------------------+----------------------------+---------------------------------+ +// | no drive | black | black | black | black | +// +----------------+---------------+-----------------------------+----------------------------+---------------------------------+ +// | drive plugged | black | black | black | black | +// +----------------+---------------+-----------------------------+----------------------------+---------------------------------+ +// | drive selected | white | blink purple, red if failed | blink green, red if failed | green if success, red if failed | +// +----------------+---------------+-----------------------------+----------------------------+---------------------------------+ +export function updateLeds({ + step, + sourceDrive, + availableDrives, + selectedDrives, + failedDrives, +}: LedsState) { + const unplugged = new Set(leds.keys()); + const plugged = new Set(availableDrives); + const selectedOk = new Set(selectedDrives); + const selectedFailed = new Set(failedDrives); + + // Remove selected devices from plugged set + for (const d of selectedOk) { + plugged.delete(d); + unplugged.delete(d); + } + + // Remove plugged devices from unplugged set + for (const d of plugged) { + unplugged.delete(d); + } + + // Remove failed devices from selected set + for (const d of selectedFailed) { + selectedOk.delete(d); + } + + const mapping: Array<{ + animation: AnimationFunction; + rgbLeds: RGBLed[]; + }> = []; + // Handle source slot + if (sourceDrive !== undefined) { + if (plugged.has(sourceDrive)) { + plugged.delete(sourceDrive); + mapping.push( + setLeds(ledAnimationFunctions.staticBlue, new Set([sourceDrive])), + ); + } + } + if (step === 'main') { + mapping.push( + setLeds( + ledAnimationFunctions.staticBlack, + new Set([...unplugged, ...plugged]), + ), + setLeds( + ledAnimationFunctions.staticWhite, + new Set([...selectedOk, ...selectedFailed]), + ), + ); + } else if (step === 'flashing') { + mapping.push( + setLeds( + ledAnimationFunctions.staticBlack, + new Set([...unplugged, ...plugged]), + ), + setLeds(ledAnimationFunctions.blinkPurple, selectedOk), + setLeds(ledAnimationFunctions.staticRed, selectedFailed), + ); + } else if (step === 'verifying') { + mapping.push( + setLeds( + ledAnimationFunctions.staticBlack, + new Set([...unplugged, ...plugged]), + ), + setLeds(ledAnimationFunctions.blinkGreen, selectedOk), + setLeds(ledAnimationFunctions.staticRed, selectedFailed), + ); + } else if (step === 'finish') { + mapping.push( + setLeds( + ledAnimationFunctions.staticBlack, + new Set([...unplugged, ...plugged]), + ), + setLeds(ledAnimationFunctions.staticGreen, selectedOk), + setLeds(ledAnimationFunctions.staticRed, selectedFailed), + ); + } + animator.mapping = mapping; +} + +let ledsState: LedsState | undefined; + +function stateObserver() { + const s = store.getState().toJS(); + let step: 'main' | 'flashing' | 'verifying' | 'finish'; + if (s.isFlashing) { + step = s.flashState.type; + } else { + step = s.lastAverageFlashingSpeed == null ? 'main' : 'finish'; + } + const availableDrives = getDrives().filter( + (d: DrivelistDrive) => d.devicePath, + ); + const sourceDrivePath = availableDrives.filter((d: DrivelistDrive) => + isSourceDrive(d, s.selection.image), + )[0]?.devicePath; + const availableDrivesPaths = availableDrives.map( + (d: DrivelistDrive) => d.devicePath, + ); + let selectedDrivesPaths: string[]; + if (step === 'main') { + selectedDrivesPaths = getSelectedDrives() + .filter((drive) => drive.devicePath !== null) + .map((drive) => drive.devicePath) as string[]; + } else { + selectedDrivesPaths = s.devicePaths; + } + const failedDevicePaths = s.failedDeviceErrors.map( + ([, { devicePath }]: [string, { devicePath: string }]) => devicePath, + ); + const newLedsState = { + step, + sourceDrive: sourceDrivePath, + availableDrives: availableDrivesPaths, + selectedDrives: selectedDrivesPaths, + failedDrives: failedDevicePaths, + } as LedsState; + if (!_.isEqual(newLedsState, ledsState)) { + updateLeds(newLedsState); + ledsState = newLedsState; + } +} + +export async function init(): Promise { + // ledsMapping is something like: + // { + // 'platform-xhci-hcd.0.auto-usb-0:1.1.1:1.0-scsi-0:0:0:0': [ + // 'led1_r', + // 'led1_g', + // 'led1_b', + // ], + // ... + // } + const ledsMapping: _.Dictionary<[string, string, string]> = + (await settings.get('ledsMapping')) || {}; + if (!_.isEmpty(ledsMapping)) { + for (const [drivePath, ledsNames] of Object.entries(ledsMapping)) { + leds.set('/dev/disk/by-path/' + drivePath, new RGBLed(ledsNames)); + } + ledColors = (await settings.get('ledColors')) || {}; + ledAnimationFunctions = { + blinkGreen: createAnimationFunction(blink, ledColors['green']), + blinkPurple: createAnimationFunction(blink, ledColors['purple']), + staticRed: createAnimationFunction(one, ledColors['red']), + staticGreen: createAnimationFunction(one, ledColors['green']), + staticBlue: createAnimationFunction(one, ledColors['blue']), + staticWhite: createAnimationFunction(one, ledColors['white']), + staticBlack: createAnimationFunction(one, ledColors['black']), + }; + observe(_.debounce(stateObserver, 1000, { maxWait: 1000 })); + } +} diff --git a/lib/gui/app/models/selection-state.ts b/lib/gui/app/models/selection-state.ts new file mode 100644 index 0000000..4faee96 --- /dev/null +++ b/lib/gui/app/models/selection-state.ts @@ -0,0 +1,128 @@ +import type { DrivelistDrive } from '../../../shared/drive-constraints'; +/* + * Copyright 2016 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { SourceMetadata } from '../../../shared/typings/source-selector'; + +import * as availableDrives from './available-drives'; +import { Actions, store } from './store'; + +/** + * @summary Select a drive by its device path + */ +export function selectDrive(driveDevice: string) { + store.dispatch({ + type: Actions.SELECT_TARGET, + data: driveDevice, + }); +} + +/** + * @summary Toggle drive selection + */ +export function toggleDrive(driveDevice: string) { + if (isDriveSelected(driveDevice)) { + deselectDrive(driveDevice); + } else { + selectDrive(driveDevice); + } +} + +export function selectSource(source: SourceMetadata) { + store.dispatch({ + type: Actions.SELECT_SOURCE, + data: source, + }); +} + +/** + * @summary Get all selected drives' devices + */ +export function getSelectedDevices(): string[] { + return store.getState().getIn(['selection', 'devices']).toJS(); +} + +/** + * @summary Get all selected drive objects + */ +export function getSelectedDrives(): DrivelistDrive[] { + const selectedDevices = getSelectedDevices(); + return availableDrives + .getDrives() + .filter((drive) => selectedDevices.includes(drive.device)); +} + +/** + * @summary Get the selected image + */ +export function getImage(): SourceMetadata | undefined { + return store.getState().toJS().selection.image; +} + +/** + * @summary Check if there is a selected drive + */ +export function hasDrive(): boolean { + return Boolean(getSelectedDevices().length); +} + +/** + * @summary Check if there is a selected image + */ +export function hasImage(): boolean { + return getImage() !== undefined; +} + +/** + * @summary Remove drive from selection + */ +export function deselectDrive(driveDevice: string) { + store.dispatch({ + type: Actions.DESELECT_TARGET, + data: driveDevice, + }); +} + +export function deselectImage() { + store.dispatch({ + type: Actions.DESELECT_SOURCE, + data: {}, + }); +} + +export function deselectAllDrives() { + getSelectedDevices().forEach(deselectDrive); +} + +/** + * @summary Clear selections + */ +export function clear() { + deselectImage(); + deselectAllDrives(); +} + +/** + * @summary Check whether a given device is selected. + */ +export function isDriveSelected(driveDevice: string) { + if (!driveDevice) { + return false; + } + + const selectedDriveDevices = getSelectedDevices(); + return selectedDriveDevices.includes(driveDevice); +} diff --git a/lib/gui/app/models/settings.ts b/lib/gui/app/models/settings.ts new file mode 100644 index 0000000..061881f --- /dev/null +++ b/lib/gui/app/models/settings.ts @@ -0,0 +1,126 @@ +/* + * Copyright 2016 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as _debug from 'debug'; +import * as electron from 'electron'; +import * as _ from 'lodash'; +import { promises as fs } from 'fs'; +import { join } from 'path'; + +import * as packageJSON from '../../../../package.json'; + +const debug = _debug('etcher:models:settings'); + +const JSON_INDENT = 2; + +export const DEFAULT_WIDTH = 800; +export const DEFAULT_HEIGHT = 480; + +/** + * @summary Userdata directory path + * @description + * Defaults to the following: + * - `%APPDATA%/etcher` on Windows + * - `$XDG_CONFIG_HOME/etcher` or `~/.config/etcher` on Linux + * - `~/Library/Application Support/etcher` on macOS + * See https://electronjs.org/docs/api/app#appgetpathname + * + * NOTE: We use the remote property when this module + * is loaded in the Electron's renderer process + */ +function getConfigPath() { + const app = electron.app || require('@electron/remote').app; + return join(app.getPath('userData'), 'config.json'); +} + +async function readConfigFile(filename: string): Promise<_.Dictionary> { + let contents = '{}'; + try { + contents = await fs.readFile(filename, { encoding: 'utf8' }); + } catch (error: any) { + // noop + } + try { + return JSON.parse(contents); + } catch (parseError) { + console.error(parseError); + return {}; + } +} + +// exported for tests +export async function readAll() { + return await readConfigFile(getConfigPath()); +} + +// exported for tests +export async function writeConfigFile( + filename: string, + data: _.Dictionary, +): Promise { + await fs.writeFile(filename, JSON.stringify(data, null, JSON_INDENT)); +} + +const DEFAULT_SETTINGS: _.Dictionary = { + errorReporting: true, + updatesEnabled: ['appimage', 'nsis', 'dmg'].includes(packageJSON.packageType), + desktopNotifications: true, + autoBlockmapping: true, + decompressFirst: true, +}; + +const settings = _.cloneDeep(DEFAULT_SETTINGS); + +async function load(): Promise { + debug('load'); + const loadedSettings = await readAll(); + _.assign(settings, loadedSettings); +} + +const loaded = load(); + +export async function set( + key: string, + value: any, + writeConfigFileFn = writeConfigFile, +): Promise { + debug('set', key, value); + await loaded; + const previousValue = settings[key]; + settings[key] = value; + try { + await writeConfigFileFn(getConfigPath(), settings); + } catch (error: any) { + // Revert to previous value if persisting settings failed + settings[key] = previousValue; + throw error; + } +} + +export async function get(key: string): Promise { + await loaded; + return getSync(key); +} + +export function getSync(key: string): any { + return _.cloneDeep(settings[key]); +} + +export async function getAll() { + debug('getAll'); + await loaded; + return _.cloneDeep(settings); +} diff --git a/lib/gui/app/models/store.ts b/lib/gui/app/models/store.ts new file mode 100644 index 0000000..27026e2 --- /dev/null +++ b/lib/gui/app/models/store.ts @@ -0,0 +1,554 @@ +/* + * Copyright 2016 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as Immutable from 'immutable'; +import * as _ from 'lodash'; +import { basename } from 'path'; +import * as redux from 'redux'; +import { v4 as uuidV4 } from 'uuid'; + +import * as constraints from '../../../shared/drive-constraints'; +import * as errors from '../../../shared/errors'; +import * as utils from '../../../shared/utils'; +import * as settings from './settings'; + +/** + * @summary Verify and throw if any state fields are nil + */ +function verifyNoNilFields( + object: _.Dictionary, + fields: string[], + name: string, +) { + const nilFields = _.filter(fields, (field) => { + return _.isNil(_.get(object, field)); + }); + if (nilFields.length) { + throw new Error(`Missing ${name} fields: ${nilFields.join(', ')}`); + } +} + +/** + * @summary FLASH_STATE fields that can't be nil + */ +const flashStateNoNilFields = ['speed']; + +/** + * @summary SELECT_IMAGE fields that can't be nil + */ +const selectImageNoNilFields = ['path', 'extension']; + +/** + * @summary Application default state + */ +export const DEFAULT_STATE = Immutable.fromJS({ + applicationSessionUuid: '', + flashingWorkflowUuid: '', + availableDrives: [], + selection: { + devices: Immutable.OrderedSet(), + }, + isFlashing: false, + devicePaths: [], + failedDeviceErrors: [], + flashResults: {}, + flashState: { + active: 0, + failed: 0, + percentage: 0, + speed: null, + averageSpeed: null, + }, + lastAverageFlashingSpeed: null, +}); + +/** + * @summary Application supported action messages + */ +export enum Actions { + SET_DEVICE_PATHS, + SET_FAILED_DEVICE_ERRORS, + SET_AVAILABLE_TARGETS, + SET_FLASH_STATE, + RESET_FLASH_STATE, + SET_FLASHING_FLAG, + UNSET_FLASHING_FLAG, + SELECT_TARGET, + SELECT_SOURCE, + DESELECT_TARGET, + DESELECT_SOURCE, + SET_APPLICATION_SESSION_UUID, + SET_FLASHING_WORKFLOW_UUID, +} + +interface Action { + type: Actions; + data: any; +} + +/** + * @summary Get available drives from the state + * + * @param {Object} state - state object + * @returns {Object} new state + */ +function getAvailableDrives(state: typeof DEFAULT_STATE) { + return state.get('availableDrives').toJS(); +} + +/** + * @summary The redux store reducer + */ +function storeReducer( + state = DEFAULT_STATE, + action: Action, +): typeof DEFAULT_STATE { + switch (action.type) { + case Actions.SET_AVAILABLE_TARGETS: { + // Type: action.data : Array + + if (!action.data) { + throw errors.createError({ + title: 'Missing drives', + }); + } + + let drives = action.data; + + if (!_.isArray(drives) || !_.every(drives, _.isObject)) { + throw errors.createError({ + title: `Invalid drives: ${drives}`, + }); + } + + // Drives order is a list of devicePaths + const drivesOrder = settings.getSync('drivesOrder') ?? []; + + drives = _.sortBy(drives, [ + // System drives last + (d) => !!d.isSystem, + // Devices with no devicePath first (usbboot) + (d) => !!d.devicePath, + // Sort as defined in the drivesOrder setting if there is one (only for Linux with udev) + (d) => drivesOrder.indexOf(basename(d.devicePath || '')), + // Then sort by devicePath (only available on Linux with udev) or device + (d) => d.devicePath || d.device, + ]); + + const newState = state.set('availableDrives', Immutable.fromJS(drives)); + const selectedDevices = newState.getIn(['selection', 'devices']).toJS(); + + // Remove selected drives that are stale, i.e. missing from availableDrives + const nonStaleNewState = _.reduce( + selectedDevices, + (accState, device) => { + // Check whether the drive still exists in availableDrives + if ( + device && + !_.find(drives, { + device, + }) + ) { + // Deselect this drive gone from availableDrives + return storeReducer(accState, { + type: Actions.DESELECT_TARGET, + data: device, + }); + } + + return accState; + }, + newState, + ); + + const shouldAutoselectAll = Boolean( + settings.getSync('autoSelectAllDrives'), + ); + const AUTOSELECT_DRIVE_COUNT = 1; + const nonStaleSelectedDevices = nonStaleNewState + .getIn(['selection', 'devices']) + .toJS(); + const hasSelectedDevices = + nonStaleSelectedDevices.length >= AUTOSELECT_DRIVE_COUNT; + const shouldAutoselectOne = + drives.length === AUTOSELECT_DRIVE_COUNT && !hasSelectedDevices; + + if (shouldAutoselectOne || shouldAutoselectAll) { + // Even if there's no image selected, we need to call several + // drive/image related checks, and `{}` works fine with them + const image = state + .getIn(['selection', 'image'], Immutable.fromJS({})) + .toJS(); + + return _.reduce( + drives, + (accState, drive) => { + if ( + constraints.isDriveValid(drive, image) && + !drive.isReadOnly && + constraints.isDriveSizeRecommended(drive, image) && + // We don't want to auto-select large drives except if autoSelectAllDrives is true + (!constraints.isDriveSizeLarge(drive) || shouldAutoselectAll) && + // We don't want to auto-select system drives + !constraints.isSystemDrive(drive) + ) { + // Auto-select this drive + return storeReducer(accState, { + type: Actions.SELECT_TARGET, + data: drive.device, + }); + } + + // Deselect this drive in case it still is selected + return storeReducer(accState, { + type: Actions.DESELECT_TARGET, + data: drive.device, + }); + }, + nonStaleNewState, + ); + } + + return nonStaleNewState; + } + + case Actions.SET_FLASH_STATE: { + // Type: action.data : FlashStateObject + + if (!state.get('isFlashing')) { + throw errors.createError({ + title: "Can't set the flashing state when not flashing", + }); + } + + verifyNoNilFields(action.data, flashStateNoNilFields, 'flash'); + + if (!_.every(_.pick(action.data, ['active', 'failed']), _.isFinite)) { + throw errors.createError({ + title: 'State quantity field(s) not finite number', + }); + } + + if ( + !_.isUndefined(action.data.percentage) && + !utils.isValidPercentage(action.data.percentage) + ) { + throw errors.createError({ + title: `Invalid state percentage: ${action.data.percentage}`, + }); + } + + if (!_.isUndefined(action.data.eta) && !_.isNumber(action.data.eta)) { + throw errors.createError({ + title: `Invalid state eta: ${action.data.eta}`, + }); + } + + let ret = state.set('flashState', Immutable.fromJS(action.data)); + if (action.data.type === 'flashing') { + ret = ret.set('lastAverageFlashingSpeed', action.data.averageSpeed); + } + return ret; + } + + case Actions.RESET_FLASH_STATE: { + return state + .set('isFlashing', false) + .set('flashState', DEFAULT_STATE.get('flashState')) + .set('flashResults', DEFAULT_STATE.get('flashResults')) + .set('devicePaths', DEFAULT_STATE.get('devicePaths')) + .set('failedDeviceErrors', DEFAULT_STATE.get('failedDeviceErrors')) + .set( + 'lastAverageFlashingSpeed', + DEFAULT_STATE.get('lastAverageFlashingSpeed'), + ) + .delete('flashUuid'); + } + + case Actions.SET_FLASHING_FLAG: { + return state + .set('isFlashing', true) + .set('flashUuid', uuidV4()) + .set('flashResults', DEFAULT_STATE.get('flashResults')); + } + + case Actions.UNSET_FLASHING_FLAG: { + // Type: action.data : FlashResultsObject + + if (!action.data) { + throw errors.createError({ + title: 'Missing results', + }); + } + + _.defaults(action.data, { + cancelled: false, + skip: false, + }); + + if (!_.isBoolean(action.data.cancelled)) { + throw errors.createError({ + title: `Invalid results cancelled: ${action.data.cancelled}`, + }); + } + + if (action.data.cancelled && action.data.sourceChecksum) { + throw errors.createError({ + title: + "The sourceChecksum value can't exist if the flashing was cancelled", + }); + } + + if ( + action.data.sourceChecksum && + !_.isString(action.data.sourceChecksum) + ) { + throw errors.createError({ + title: `Invalid results sourceChecksum: ${action.data.sourceChecksum}`, + }); + } + + if ( + action.data.errorCode && + !_.isString(action.data.errorCode) && + !_.isNumber(action.data.errorCode) + ) { + throw errors.createError({ + title: `Invalid results errorCode: ${action.data.errorCode}`, + }); + } + + if (action.data.results) { + action.data.results.averageFlashingSpeed = state.get( + 'lastAverageFlashingSpeed', + ); + } + + if (action.data.skip) { + return state + .set('isFlashing', false) + .set('flashResults', Immutable.fromJS(action.data)); + } + + return state + .set('isFlashing', false) + .set('flashResults', Immutable.fromJS(action.data)) + .set('flashState', DEFAULT_STATE.get('flashState')); + } + + case Actions.SELECT_TARGET: { + // Type: action.data : String + + const device = action.data; + + if (!device) { + throw errors.createError({ + title: 'Missing drive', + }); + } + + if (!_.isString(device)) { + throw errors.createError({ + title: `Invalid drive: ${device}`, + }); + } + + const selectedDrive = _.find(getAvailableDrives(state), { device }); + + if (!selectedDrive) { + throw errors.createError({ + title: `The drive is not available: ${device}`, + }); + } + + if (selectedDrive.isReadOnly) { + throw errors.createError({ + title: 'The drive is write-protected', + }); + } + + const image = state.getIn(['selection', 'image']); + if ( + image && + !constraints.isDriveLargeEnough(selectedDrive, image.toJS()) + ) { + throw errors.createError({ + title: 'The drive is not large enough', + }); + } + + const selectedDevices = state.getIn(['selection', 'devices']); + + return state.setIn(['selection', 'devices'], selectedDevices.add(device)); + } + + // TODO(jhermsmeier): Consolidate these assertions + // with image-stream / supported-formats, and have *one* + // place where all the image extension / format handling + // takes place, to avoid having to check 2+ locations with different logic + case Actions.SELECT_SOURCE: { + // Type: action.data : ImageObject + + if (!action.data.drive) { + verifyNoNilFields(action.data, selectImageNoNilFields, 'image'); + } + + if (!_.isString(action.data.path)) { + throw errors.createError({ + title: `Invalid image path: ${action.data.path}`, + }); + } + + const MINIMUM_IMAGE_SIZE = 0; + + if (action.data.size !== undefined) { + if ( + action.data.size < MINIMUM_IMAGE_SIZE || + !_.isInteger(action.data.size) + ) { + throw errors.createError({ + title: `Invalid image size: ${action.data.size}`, + }); + } + } + + if (!_.isUndefined(action.data.compressedSize)) { + if ( + action.data.compressedSize < MINIMUM_IMAGE_SIZE || + !_.isInteger(action.data.compressedSize) + ) { + throw errors.createError({ + title: `Invalid image compressed size: ${action.data.compressedSize}`, + }); + } + } + + if (action.data.url && !_.isString(action.data.url)) { + throw errors.createError({ + title: `Invalid image url: ${action.data.url}`, + }); + } + + if (action.data.name && !_.isString(action.data.name)) { + throw errors.createError({ + title: `Invalid image name: ${action.data.name}`, + }); + } + + if (action.data.logo && !_.isString(action.data.logo)) { + throw errors.createError({ + title: `Invalid image logo: ${action.data.logo}`, + }); + } + + const selectedDevices = state.getIn(['selection', 'devices']); + + // Remove image-incompatible drives from selection with `constraints.isDriveValid` + return _.reduce( + selectedDevices.toJS(), + (accState, device) => { + const drive = _.find(getAvailableDrives(state), { device }); + if ( + !constraints.isDriveValid(drive, action.data) || + !constraints.isDriveSizeRecommended(drive, action.data) + ) { + return storeReducer(accState, { + type: Actions.DESELECT_TARGET, + data: device, + }); + } + + return accState; + }, + state, + ).setIn(['selection', 'image'], Immutable.fromJS(action.data)); + } + + case Actions.DESELECT_TARGET: { + // Type: action.data : String + + if (!action.data) { + throw errors.createError({ + title: 'Missing drive', + }); + } + + if (!_.isString(action.data)) { + throw errors.createError({ + title: `Invalid drive: ${action.data}`, + }); + } + + const selectedDevices = state.getIn(['selection', 'devices']); + + // Remove drive from set in state + return state.setIn( + ['selection', 'devices'], + selectedDevices.delete(action.data), + ); + } + + case Actions.DESELECT_SOURCE: { + return state.deleteIn(['selection', 'image']); + } + + case Actions.SET_APPLICATION_SESSION_UUID: { + return state.set('applicationSessionUuid', action.data); + } + + case Actions.SET_FLASHING_WORKFLOW_UUID: { + return state.set('flashingWorkflowUuid', action.data); + } + + case Actions.SET_DEVICE_PATHS: { + return state.set('devicePaths', action.data); + } + + case Actions.SET_FAILED_DEVICE_ERRORS: { + return state.set('failedDeviceErrors', action.data); + } + + default: { + return state; + } + } +} + +export const store = redux.createStore(storeReducer, DEFAULT_STATE); + +/** + * @summary Observe the store for changes + * @param {Function} onChange - change handler + * @returns {Function} unsubscribe + */ +export function observe(onChange: (state: typeof DEFAULT_STATE) => void) { + let currentState: typeof DEFAULT_STATE | null = null; + + /** + * @summary Internal change detection handler + */ + const changeHandler = () => { + const nextState = store.getState(); + if (!_.isEqual(nextState, currentState)) { + currentState = nextState; + onChange(currentState); + } + }; + + changeHandler(); + + return store.subscribe(changeHandler); +} diff --git a/lib/gui/app/modules/analytics.ts b/lib/gui/app/modules/analytics.ts new file mode 100644 index 0000000..5452e19 --- /dev/null +++ b/lib/gui/app/modules/analytics.ts @@ -0,0 +1,140 @@ +/* + * Copyright 2016 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { findLastIndex, once } from 'lodash'; +import * as SentryRenderer from '@sentry/electron/renderer'; +import * as settings from '../models/settings'; + +type AnalyticsPayload = _.Dictionary; + +const clearUserPath = (filename: string): string => { + const generatedFile = filename.split('generated').reverse()[0]; + return generatedFile !== filename ? `generated${generatedFile}` : filename; +}; + +export const anonymizeSentryData = ( + event: SentryRenderer.Event, +): SentryRenderer.Event => { + event.exception?.values?.forEach((exception) => { + exception.stacktrace?.frames?.forEach((frame) => { + if (frame.filename) { + frame.filename = clearUserPath(frame.filename); + } + }); + }); + + event.breadcrumbs?.forEach((breadcrumb) => { + if (breadcrumb.data?.url) { + breadcrumb.data.url = clearUserPath(breadcrumb.data.url); + } + }); + + if (event.request?.url) { + event.request.url = clearUserPath(event.request.url); + } + + return event; +}; + +const extractPathRegex = /(.*)(^|\s)(file:\/\/)?(\w:)?([\\/].+)/; +const etcherSegmentMarkers = ['app.asar', 'Resources']; + +export const anonymizePath = (input: string) => { + // First, extract a part of the value that matches a path pattern. + const match = extractPathRegex.exec(input); + if (match === null) { + return input; + } + const mainPart = match[5]; + const space = match[2]; + const beginning = match[1]; + const uriPrefix = match[3] || ''; + + // We have to deal with both Windows and POSIX here. + // The path starts with its separator (we work with absolute paths). + const sep = mainPart[0]; + const segments = mainPart.split(sep); + + // Moving from the end, find the first marker and cut the path from there. + const startCutIndex = findLastIndex(segments, (segment) => + etcherSegmentMarkers.includes(segment), + ); + return ( + beginning + + space + + uriPrefix + + '[PERSONAL PATH]' + + sep + + segments.splice(startCutIndex).join(sep) + ); +}; + +const safeAnonymizePath = (input: string) => { + try { + return anonymizePath(input); + } catch (e) { + return '[ANONYMIZE PATH FAILED]'; + } +}; + +const sensitiveEtcherProperties = [ + 'error.description', + 'error.message', + 'error.stack', + 'image', + 'image.path', + 'path', +]; + +export const anonymizeAnalyticsPayload = ( + data: AnalyticsPayload, +): AnalyticsPayload => { + for (const prop of sensitiveEtcherProperties) { + const value = data[prop]; + if (value != null) { + data[prop] = safeAnonymizePath(value.toString()); + } + } + return data; +}; + +/** + * @summary Init analytics configurations + */ +export const initAnalytics = once(() => { + const dsn = + settings.getSync('analyticsSentryToken') || process.env.SENTRY_TOKEN; + SentryRenderer.init({ + dsn, + beforeSend: anonymizeSentryData, + debug: process.env.ETCHER_SENTRY_DEBUG === 'true', + }); +}); + +/** + * @summary Log an exception + * + * @description + * This function logs an exception to error reporting services. + */ +export function logException(error: any) { + const shouldReportErrors = settings.getSync('errorReporting'); + console.error(error); + if (shouldReportErrors) { + initAnalytics(); + SentryRenderer.captureException(error); + } +} diff --git a/lib/gui/app/modules/api.ts b/lib/gui/app/modules/api.ts new file mode 100644 index 0000000..886eef1 --- /dev/null +++ b/lib/gui/app/modules/api.ts @@ -0,0 +1,253 @@ +/** This function will : + * - start the ipc server (api) + * - spawn the child process (privileged or not) + * - wait for the child process to connect to the api + * - return a promise that will resolve with the emit function for the api + * + * //TODO: + * - this should be refactored to reverse the control flow: + * - the child process should be the server + * - this should be the client + * - replace the current node-ipc api with a websocket api + * - centralise the api for both the writer and the scanner instead of having two instances running + */ + +import WebSocket from 'ws'; // (no types for wrapper, this is expected) +import { spawn, exec } from 'child_process'; +import * as os from 'os'; +import * as packageJSON from '../../../../package.json'; +import * as permissions from '../../../shared/permissions'; +import * as errors from '../../../shared/errors'; + +const THREADS_PER_CPU = 16; +const connectionRetryDelay = 1000; +const connectionRetryAttempts = 10; + +async function writerArgv(): Promise { + let entryPoint = await window.etcher.getEtcherUtilPath(); + // AppImages run over FUSE, so the files inside the mount point + // can only be accessed by the user that mounted the AppImage. + // This means we can't re-spawn Etcher as root from the same + // mount-point, and as a workaround, we re-mount the original + // AppImage as root. + if (os.platform() === 'linux' && process.env.APPIMAGE && process.env.APPDIR) { + entryPoint = entryPoint.replace(process.env.APPDIR, ''); + return [ + process.env.APPIMAGE, + '-e', + `require(\`\${process.env.APPDIR}${entryPoint}\`)`, + ]; + } else { + return [entryPoint]; + } +} + +async function spawnChild( + withPrivileges: boolean, + etcherServerId: string, + etcherServerAddress: string, + etcherServerPort: string, +) { + const argv = await writerArgv(); + const env: any = { + ETCHER_SERVER_ADDRESS: etcherServerAddress, + ETCHER_SERVER_ID: etcherServerId, + ETCHER_SERVER_PORT: etcherServerPort, + UV_THREADPOOL_SIZE: (os.cpus().length * THREADS_PER_CPU).toString(), + // This environment variable prevents the AppImages + // desktop integration script from presenting the + // "installation" dialog + SKIP: '1', + ...(process.platform === 'win32' ? {} : process.env), + }; + + if (withPrivileges) { + console.log('... with privileges ...'); + return permissions.elevateCommand(argv, { + applicationName: packageJSON.displayName, + env, + }); + } else { + if (process.platform === 'win32') { + // we need to ensure we reset the env as a previous elevation process might have kept them in a wrong state + const envCommand = []; + for (const key in env) { + if (Object.prototype.hasOwnProperty.call(env, key)) { + envCommand.push(`set ${key}=${env[key]}`); + } + } + await exec(envCommand.join(' && ')); + } + const spawned = await spawn(argv[0], argv.slice(1), { + env, + }); + return { cancelled: false, spawned }; + } +} + +type ChildApi = { + emit: (type: string, payload: any) => void; + registerHandler: (event: string, handler: any) => void; + failed: boolean; +}; + +async function connectToChildProcess( + etcherServerAddress: string, + etcherServerPort: string, + etcherServerId: string, +): Promise { + return new Promise((resolve, reject) => { + // TODO: default to IPC connections https://github.com/websockets/ws/blob/master/doc/ws.md#ipc-connections + // TODO: use the path as cheap authentication + + console.log(etcherServerId); + + const url = `ws://${etcherServerAddress}:${etcherServerPort}`; + + const ws = new WebSocket(url); + + let heartbeat: any; + + const startHeartbeat = (emit: any) => { + console.log('start heartbeat'); + heartbeat = setInterval(() => { + emit('heartbeat', {}); + }, 1000); + }; + + const stopHeartbeat = () => { + console.log('stop heartbeat'); + clearInterval(heartbeat); + }; + + ws.on('error', (error: any) => { + if (error.code === 'ECONNREFUSED') { + resolve({ + failed: true, + }); + } else { + stopHeartbeat(); + reject({ + failed: true, + }); + } + }); + + ws.on('open', () => { + const emit = (type: string, payload: any) => { + ws.send(JSON.stringify({ type, payload })); + }; + + emit('ready', {}); + + // parse and route messages + const messagesHandler: any = { + log: (message: any) => { + console.log(`CHILD LOG: ${message}`); + }, + + error: (error: any) => { + const errorObject = errors.fromJSON(error); + console.error('CHILD ERROR', errorObject); + stopHeartbeat(); + }, + + // once api is ready (means child process is connected) we pass the emit function to the caller + ready: () => { + console.log('CHILD READY'); + + startHeartbeat(emit); + + resolve({ + failed: false, + emit, + registerHandler, + }); + }, + }; + + ws.on('message', (jsonData: any) => { + const data = JSON.parse(jsonData); + const message = messagesHandler[data.type]; + if (message) { + message(data.payload); + } else { + throw new Error(`Unknown message type: ${data.type}`); + } + }); + + // api to register more handlers with callbacks + const registerHandler = (event: string, handler: any) => { + messagesHandler[event] = handler; + }; + }); + }); +} + +async function spawnChildAndConnect({ + withPrivileges, +}: { + withPrivileges: boolean; +}): Promise { + const etcherServerAddress = process.env.ETCHER_SERVER_ADDRESS ?? '127.0.0.1'; // localhost + const etcherServerPort = + process.env.ETCHER_SERVER_PORT ?? withPrivileges ? '3435' : '3434'; + const etcherServerId = + process.env.ETCHER_SERVER_ID ?? + `etcher-${Math.random().toString(36).substring(7)}`; + + console.log( + `Starting ${ + withPrivileges ? 'priviledged' : 'unpriviledged' + } flasher sidecar on port ${etcherServerPort}`, + ); + + // spawn the child process, which will act as the ws server + // ETCHER_NO_SPAWN_UTIL can be set to launch a GUI only version of etcher, in that case you'll probably want to set other ENV to match your setup + if (!process.env.ETCHER_NO_SPAWN_UTIL) { + try { + const result = await spawnChild( + withPrivileges, + etcherServerId, + etcherServerAddress, + etcherServerPort, + ); + if (result.cancelled) { + throw new Error('Starting flasher sidecar process was cancelled'); + } + } catch (error) { + console.error('Error starting flasher sidecar process', error); + throw new Error('Error starting flasher sidecar process'); + } + } + + // try to connect to the ws server, retrying if necessary, until the connection is established + try { + let retry = 0; + while (retry < connectionRetryAttempts) { + const { emit, registerHandler, failed } = await connectToChildProcess( + etcherServerAddress, + etcherServerPort, + etcherServerId, + ); + if (failed) { + retry++; + console.log( + `Connection to sidecar flasher process attempt ${retry} / ${connectionRetryAttempts} failed; retrying in ${connectionRetryDelay}ms...`, + ); + await new Promise((resolve) => + setTimeout(resolve, connectionRetryDelay), + ); + continue; + } + return { failed, emit, registerHandler }; + } + // TODO: raised an error to the user if we reach this point + throw new Error('Connection to sidecar flasher process timed out'); + } catch (error) { + console.error('Error connecting to sidecar flasher process process', error); + throw new Error('Connection to sidecar flasher process failed'); + } +} + +export { spawnChildAndConnect }; diff --git a/lib/gui/app/modules/exception-reporter.ts b/lib/gui/app/modules/exception-reporter.ts new file mode 100644 index 0000000..641141a --- /dev/null +++ b/lib/gui/app/modules/exception-reporter.ts @@ -0,0 +1,29 @@ +/* + * Copyright 2016 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { logException } from '../modules/analytics'; +import { showError } from '../os/dialog'; + +/** + * @summary Report an exception + */ +export function report(exception?: Error) { + if (exception === undefined) { + return; + } + showError(exception); + logException(exception); +} diff --git a/lib/gui/app/modules/image-writer.ts b/lib/gui/app/modules/image-writer.ts new file mode 100644 index 0000000..8bcadc5 --- /dev/null +++ b/lib/gui/app/modules/image-writer.ts @@ -0,0 +1,186 @@ +/* + * Copyright 2016 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { Drive as DrivelistDrive } from 'drivelist'; +import type * as sdk from 'etcher-sdk'; +import type { Dictionary } from 'lodash'; +import * as errors from '../../../shared/errors'; +import type { SourceMetadata } from '../../../shared/typings/source-selector'; +import * as flashState from '../models/flash-state'; +import * as settings from '../models/settings'; +import * as windowProgress from '../os/window-progress'; +import { spawnChildAndConnect } from './api'; + +let cancelEmitter: (type: string) => void | undefined; +interface FlashResults { + skip?: boolean; + cancelled?: boolean; + results?: { + bytesWritten: number; + devices: { + failed: number; + successful: number; + }; + errors: Error[]; + }; +} + +async function performWrite( + image: SourceMetadata, + drives: DrivelistDrive[], + onProgress: sdk.multiWrite.OnProgressFunction, +): Promise<{ cancelled?: boolean }> { + const { autoBlockmapping, decompressFirst } = await settings.getAll(); + + // Spawn the child process with privileges and wait for the connection to be made + const { emit, registerHandler } = await spawnChildAndConnect({ + withPrivileges: true, + }); + + return await new Promise((resolve, reject) => { + // if the connection failed, reject the promise + + const flashResults: FlashResults = {}; + + const onFail = ({ device, error }: { device: any; error: any }) => { + console.log('fail event'); + console.log(device); + console.log(error); + if (device.devicePath) { + flashState.addFailedDeviceError({ device, error }); + } + finish(); + }; + + const onDone = (payload: any) => { + console.log('CHILD: flash done', payload); + payload.results.errors = payload.results.errors.map( + (data: Dictionary & { message: string }) => { + return errors.fromJSON(data); + }, + ); + flashResults.results = payload.results; + finish(); + }; + + const onAbort = () => { + console.log('CHILD: flash aborted'); + flashResults.cancelled = true; + finish(); + }; + + const onSkip = () => { + console.log('CHILD: validation skipped'); + flashResults.skip = true; + finish(); + }; + + const finish = () => { + console.log('Flash results', flashResults); + + // The flash wasn't cancelled and we didn't get a 'done' event + // Catch unexpected situation + if ( + !flashResults.cancelled && + !flashResults.skip && + flashResults.results === undefined + ) { + console.log(flashResults); + reject( + errors.createUserError({ + title: 'The writer process ended unexpectedly', + description: + 'Please try again, and contact the Etcher team if the problem persists', + }), + ); + } + + resolve(flashResults); + }; + + registerHandler('state', onProgress); + registerHandler('fail', onFail); + registerHandler('done', onDone); + registerHandler('abort', onAbort); + registerHandler('skip', onSkip); + + cancelEmitter = (cancelStatus: string) => emit('cancel', cancelStatus); + + // Now that we know we're connected we can instruct the child process to start the write + const parameters = { + image, + destinations: drives, + SourceType: image.SourceType, + autoBlockmapping, + decompressFirst, + }; + console.log('params', parameters); + emit('write', parameters); + }); + + // The process continue in the event handler +} + +/** + * @summary Flash an image to drives + */ +export async function flash( + image: SourceMetadata, + drives: DrivelistDrive[], + // This function is a parameter so it can be mocked in tests + write = performWrite, +): Promise { + if (flashState.isFlashing()) { + throw new Error('There is already a flash in progress'); + } + + await flashState.setFlashingFlag(); + + flashState.setDevicePaths( + drives.map((d) => d.devicePath).filter((p) => p != null) as string[], + ); + + // start api and call the flasher + try { + const result = await write(image, drives, flashState.setProgressState); + console.log('got results', result); + await flashState.unsetFlashingFlag(result); + console.log('removed flashing flag'); + } catch (error: any) { + await flashState.unsetFlashingFlag({ + cancelled: false, + errorCode: error.code, + }); + + windowProgress.clear(); + + throw error; + } + + windowProgress.clear(); +} + +/** + * @summary Cancel write operation + * //TODO: find a better solution to handle cancellation + */ +export async function cancel(type: string) { + const status = type.toLowerCase(); + + if (cancelEmitter) { + cancelEmitter(status); + } +} diff --git a/lib/gui/app/modules/progress-status.ts b/lib/gui/app/modules/progress-status.ts new file mode 100644 index 0000000..b049563 --- /dev/null +++ b/lib/gui/app/modules/progress-status.ts @@ -0,0 +1,87 @@ +/* + * Copyright 2017 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License") + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import prettyBytes from 'pretty-bytes'; +import * as i18next from 'i18next'; + +export interface FlashState { + active: number; + failed: number; + percentage?: number; + speed: number; + position: number; + type?: 'decompressing' | 'flashing' | 'verifying'; +} + +export function fromFlashState({ + type, + percentage, + position, +}: Pick): { + status: string; + position?: string; +} { + if (type === undefined) { + return { status: i18next.t('progress.starting') }; + } else if (type === 'decompressing') { + if (percentage == null) { + return { status: i18next.t('progress.decompressing') }; + } else { + return { + position: `${percentage}%`, + status: i18next.t('progress.decompressing'), + }; + } + } else if (type === 'flashing') { + if (percentage != null) { + if (percentage < 100) { + return { + position: `${percentage}%`, + status: i18next.t('progress.flashing'), + }; + } else { + return { status: i18next.t('progress.finishing') }; + } + } else { + return { + status: i18next.t('progress.flashing'), + position: `${position ? prettyBytes(position) : ''}`, + }; + } + } else if (type === 'verifying') { + if (percentage == null) { + return { status: i18next.t('progress.verifying') }; + } else if (percentage < 100) { + return { + position: `${percentage}%`, + status: i18next.t('progress.verifying'), + }; + } else { + return { status: i18next.t('progress.finishing') }; + } + } + return { status: i18next.t('progress.failing') }; +} + +export function titleFromFlashState( + state: Pick, +): string { + const { status, position } = fromFlashState(state); + if (position !== undefined) { + return `${position} ${status}`; + } + return status; +} diff --git a/lib/gui/app/os/dialog.ts b/lib/gui/app/os/dialog.ts new file mode 100644 index 0000000..b882dce --- /dev/null +++ b/lib/gui/app/os/dialog.ts @@ -0,0 +1,117 @@ +/* + * Copyright 2016 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as electron from 'electron'; +import * as remote from '@electron/remote'; +import * as _ from 'lodash'; + +import * as errors from '../../../shared/errors'; +import * as settings from '../../../gui/app/models/settings'; +import { SUPPORTED_EXTENSIONS } from '../../../shared/supported-formats'; +import * as i18next from 'i18next'; + +async function mountSourceDrive() { + // sourceDrivePath is the name of the link in /dev/disk/by-path + const sourceDrivePath = await settings.get('automountOnFileSelect'); + if (sourceDrivePath) { + try { + await electron.ipcRenderer.invoke('mount-drive', sourceDrivePath); + } catch (error: any) { + // noop + } + } +} + +/** + * @summary Open an image selection dialog + * + * @description + * Notice that by image, we mean *.img/*.iso/*.zip/etc files. + */ +export async function selectImage(): Promise { + await mountSourceDrive(); + const options: electron.OpenDialogOptions = { + // This variable is set when running in GNU/Linux from + // inside an AppImage, and represents the working directory + // from where the AppImage was run (which might not be the + // place where the AppImage is located). `OWD` stands for + // "Original Working Directory". + // + // See: https://github.com/probonopd/AppImageKit/commit/1569d6f8540aa6c2c618dbdb5d6fcbf0003952b7 + defaultPath: process.env.OWD, + properties: ['openFile', 'treatPackageAsDirectory'], + filters: [ + { + name: i18next.t('source.osImages'), + extensions: SUPPORTED_EXTENSIONS, + }, + { + name: i18next.t('source.allFiles'), + extensions: ['*'], + }, + ], + }; + const currentWindow = remote.getCurrentWindow(); + const [file] = (await remote.dialog.showOpenDialog(currentWindow, options)) + .filePaths; + return file; +} + +/** + * @summary Open a warning dialog + */ +export async function showWarning(options: { + confirmationLabel: string; + rejectionLabel: string; + title: string; + description: string; +}): Promise { + _.defaults(options, { + confirmationLabel: i18next.t('ok'), + rejectionLabel: i18next.t('cancel'), + }); + + const BUTTONS = [options.confirmationLabel, options.rejectionLabel]; + + const BUTTON_CONFIRMATION_INDEX = _.indexOf( + BUTTONS, + options.confirmationLabel, + ); + const BUTTON_REJECTION_INDEX = _.indexOf(BUTTONS, options.rejectionLabel); + + const { response } = await remote.dialog.showMessageBox( + remote.getCurrentWindow(), + { + type: 'warning', + buttons: BUTTONS, + defaultId: BUTTON_REJECTION_INDEX, + cancelId: BUTTON_REJECTION_INDEX, + title: i18next.t('attention'), + message: options.title, + detail: options.description, + }, + ); + return response === BUTTON_CONFIRMATION_INDEX; +} + +/** + * @summary Show error dialog for an Error instance + */ +export function showError(error: Error) { + const title = errors.getTitle(error); + const message = errors.getDescription(error); + remote.dialog.showErrorBox(title, message); +} diff --git a/lib/gui/app/os/notification.ts b/lib/gui/app/os/notification.ts new file mode 100644 index 0000000..4cc9aa3 --- /dev/null +++ b/lib/gui/app/os/notification.ts @@ -0,0 +1,36 @@ +/* + * Copyright 2017 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as remote from '@electron/remote'; + +import * as settings from '../models/settings'; + +/** + * @summary Send a notification + */ +export async function send(title: string, body: string, icon: string) { + // Bail out if desktop notifications are disabled + if (!(await settings.get('desktopNotifications'))) { + return; + } + + // `app.dock` is only defined in OS X + if (remote.app.dock) { + remote.app.dock.bounce(); + } + + return new window.Notification(title, { body, icon }); +} diff --git a/lib/gui/app/os/open-external/services/open-external.ts b/lib/gui/app/os/open-external/services/open-external.ts new file mode 100644 index 0000000..e9afb36 --- /dev/null +++ b/lib/gui/app/os/open-external/services/open-external.ts @@ -0,0 +1,32 @@ +/* + * Copyright 2016 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as electron from 'electron'; +import * as settings from '../../../models/settings'; + +/** + * @summary Open an external resource + */ +export async function open(url: string) { + // Don't open links if they're disabled by the env var + if (await settings.get('disableExternalLinks')) { + return; + } + + if (url) { + electron.shell.openExternal(url); + } +} diff --git a/lib/gui/app/os/window-progress.ts b/lib/gui/app/os/window-progress.ts new file mode 100644 index 0000000..b131f7c --- /dev/null +++ b/lib/gui/app/os/window-progress.ts @@ -0,0 +1,66 @@ +/* + * Copyright 2016 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as remote from '@electron/remote'; + +import { percentageToFloat } from '../../../shared/utils'; +import type { FlashState } from '../modules/progress-status'; +import { titleFromFlashState } from '../modules/progress-status'; + +/** + * @summary The title of the main window upon program launch + */ +const INITIAL_TITLE = document.title; + +/** + * @summary Make the full window status title + */ +function getWindowTitle(state?: FlashState) { + if (state) { + return `${INITIAL_TITLE} – ${titleFromFlashState(state)}`; + } + return INITIAL_TITLE; +} + +/** + * @summary A reference to the current renderer Electron window + * + * @description + * We expose this property to `this` for testability purposes. + */ +export const currentWindow = remote.getCurrentWindow(); + +/** + * @summary Set operating system window progress + * + * @description + * Show progress inline in operating system task bar + */ +export function set(state: FlashState) { + if (state.percentage != null) { + currentWindow.setProgressBar(percentageToFloat(state.percentage)); + } + currentWindow.setTitle(getWindowTitle(state)); +} + +/** + * @summary Clear the window progress bar + */ +export function clear() { + // Passing 0 or null/undefined doesn't work. + currentWindow.setProgressBar(-1); + currentWindow.setTitle(getWindowTitle(undefined)); +} diff --git a/lib/gui/app/os/windows-network-drives.ts b/lib/gui/app/os/windows-network-drives.ts new file mode 100755 index 0000000..bc5df9a --- /dev/null +++ b/lib/gui/app/os/windows-network-drives.ts @@ -0,0 +1,115 @@ +/* + * Copyright 2019 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { exec } from 'child_process'; +import { withTmpFile } from 'etcher-sdk/build/tmp'; +import { readFile } from 'fs'; +import { chain, trim } from 'lodash'; +import { platform } from 'os'; +import { join } from 'path'; +import { env } from 'process'; +import { promisify } from 'util'; + +const readFileAsync = promisify(readFile); + +const execAsync = promisify(exec); + +/** + * @summary Returns wmic's output for network drives + */ +async function getWmicNetworkDrivesOutput(): Promise { + // When trying to read wmic's stdout directly from node, it is encoded with the current + // console codepage (depending on the computer). + // Decoding this would require getting this codepage somehow and using iconv as node + // doesn't know how to read cp850 directly for example. + // We could also use wmic's "/output:" switch but it doesn't work when the filename + // contains a space and the os temp dir may contain spaces ("D:\Windows Temp Files" for example). + // So we just redirect to a file and read it afterwards as we know it will be ucs2 encoded. + const options = { + // Close the file once it's created + keepOpen: false, + // Wmic fails with "Invalid global switch" when the "/output:" switch filename contains a dash ("-") + prefix: 'tmp', + }; + return withTmpFile(options, async ({ path }) => { + const command = [ + join(env.SystemRoot as string, 'System32', 'Wbem', 'wmic'), + 'path', + 'Win32_LogicalDisk', + 'Where', + 'DriveType="4"', + 'get', + 'DeviceID,ProviderName', + '>', + `"${path}"`, + ]; + await execAsync(command.join(' '), { windowsHide: true }); + return readFileAsync(path, 'ucs2'); + }); +} + +/** + * @summary returns a Map of drive letter -> network locations on Windows: 'Z:' -> '\\\\192.168.0.1\\Public' + */ +async function getWindowsNetworkDrives( + getWmicOutput: () => Promise, +): Promise> { + const result = await getWmicOutput(); + const couples: Array<[string, string]> = chain(result) + .split('\n') + // Remove header line + .slice(1) + // Remove extra spaces / tabs / carriage returns + .invokeMap(String.prototype.trim) + // Filter out empty lines + .compact() + .map((str: string): [string, string] => { + const colonPosition = str.indexOf(':'); + if (colonPosition === -1) { + throw new Error(`Can't parse wmic output: ${result}`); + } + return [ + str.slice(0, colonPosition + 1), + trim(str.slice(colonPosition + 1)), + ]; + }) + .filter((couple) => couple[1].length > 0) + .value(); + return new Map(couples); +} + +/** + * @summary Replaces network drive letter with network drive location in the provided filePath on Windows + */ +export async function replaceWindowsNetworkDriveLetter( + filePath: string, + // getWmicOutput is a parameter so it can be replaced in tests + getWmicOutput = getWmicNetworkDrivesOutput, +): Promise { + let result = filePath; + if (platform() === 'win32') { + const matches = /^([A-Z]+:)\\(.*)$/.exec(filePath); + if (matches !== null) { + const [, drive, relativePath] = matches; + const drives = await getWindowsNetworkDrives(getWmicOutput); + const location = drives.get(drive); + if (location !== undefined) { + result = `${location}\\${relativePath}`; + } + } + } + return result; +} diff --git a/lib/gui/app/pages/main/Flash.tsx b/lib/gui/app/pages/main/Flash.tsx new file mode 100644 index 0000000..0042f62 --- /dev/null +++ b/lib/gui/app/pages/main/Flash.tsx @@ -0,0 +1,350 @@ +/* + * Copyright 2016 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import CircleSvg from '@fortawesome/fontawesome-free/svgs/solid/circle.svg'; +import * as _ from 'lodash'; +import * as path from 'path'; +import * as React from 'react'; +import { Flex, Modal as SmallModal, Txt } from 'rendition'; + +import * as constraints from '../../../../shared/drive-constraints'; +import * as messages from '../../../../shared/messages'; +import { ProgressButton } from '../../components/progress-button/progress-button'; +import * as availableDrives from '../../models/available-drives'; +import * as flashState from '../../models/flash-state'; +import * as selection from '../../models/selection-state'; +import * as analytics from '../../modules/analytics'; +import * as imageWriter from '../../modules/image-writer'; +import * as notification from '../../os/notification'; +import { + selectAllTargets, + TargetSelectorModal, +} from '../../components/target-selector/target-selector'; + +import FlashSvg from '../../../assets/flash.svg'; +import DriveStatusWarningModal from '../../components/drive-status-warning-modal/drive-status-warning-modal'; +import * as i18next from 'i18next'; + +const COMPLETED_PERCENTAGE = 100; +const SPEED_PRECISION = 2; + +const getErrorMessageFromCode = (errorCode: string) => { + // TODO: All these error codes to messages translations + // should go away if the writer emitted user friendly + // messages on the first place. + if (errorCode === 'EVALIDATION') { + return messages.error.validation(); + } else if (errorCode === 'EUNPLUGGED') { + return messages.error.driveUnplugged(); + } else if (errorCode === 'EIO') { + return messages.error.inputOutput(); + } else if (errorCode === 'ENOSPC') { + return messages.error.notEnoughSpaceInDrive(); + } else if (errorCode === 'ECHILDDIED') { + return messages.error.childWriterDied(); + } + return ''; +}; + +function notifySuccess( + iconPath: string, + basename: string, + drives: any, + devices: { successful: number; failed: number }, +) { + notification.send( + 'Flash complete!', + messages.info.flashComplete(basename, drives, devices), + iconPath, + ); +} + +function notifyFailure(iconPath: string, basename: string, drives: any) { + notification.send( + 'Oops! Looks like the flash failed.', + messages.error.flashFailure(basename, drives), + iconPath, + ); +} + +async function flashImageToDrive( + isFlashing: boolean, + goToSuccess: () => void, +): Promise { + const devices = selection.getSelectedDevices(); + const image: any = selection.getImage(); + const drives = availableDrives.getDrives().filter((drive: any) => { + return devices.includes(drive.device); + }); + + if (drives.length === 0 || isFlashing) { + return ''; + } + + const iconPath = path.join('media', 'icon.png'); + const basename = path.basename(image.path); + try { + await imageWriter.flash(image, drives); + if (!flashState.wasLastFlashCancelled()) { + const { + results = { devices: { successful: 0, failed: 0 } }, + skip, + cancelled, + } = flashState.getFlashResults(); + if (!skip && !cancelled) { + if (results?.devices?.successful > 0) { + notifySuccess(iconPath, basename, drives, results.devices); + } else { + notifyFailure(iconPath, basename, drives); + } + } + goToSuccess(); + } + } catch (error: any) { + notifyFailure(iconPath, basename, drives); + let errorMessage = getErrorMessageFromCode(error.code); + if (!errorMessage) { + error.image = basename; + analytics.logException(error); + errorMessage = messages.error.genericFlashError(error); + } + return errorMessage; + } finally { + availableDrives.setDrives([]); + } + + return ''; +} + +const formatSeconds = (totalSeconds: number) => { + if (typeof totalSeconds !== 'number' || !Number.isFinite(totalSeconds)) { + return ''; + } + const minutes = Math.floor(totalSeconds / 60); + const seconds = Math.floor(totalSeconds - minutes * 60); + + return `${minutes}m${seconds}s`; +}; + +interface FlashStepProps { + shouldFlashStepBeDisabled: boolean; + goToSuccess: () => void; + isFlashing: boolean; + style?: React.CSSProperties; + // TODO: factorize + step: 'decompressing' | 'flashing' | 'verifying'; + percentage: number; + position: number; + failed: number; + speed?: number; + eta?: number; + width: string; +} + +export interface DriveWithWarnings extends constraints.DrivelistDrive { + statuses: constraints.DriveStatus[]; +} + +interface FlashStepState { + warningMessage: boolean; + errorMessage: string; + showDriveSelectorModal: boolean; + systemDrives: boolean; + drivesWithWarnings: DriveWithWarnings[]; +} + +export class FlashStep extends React.PureComponent< + FlashStepProps, + FlashStepState +> { + constructor(props: FlashStepProps) { + super(props); + this.state = { + warningMessage: false, + errorMessage: '', + showDriveSelectorModal: false, + systemDrives: false, + drivesWithWarnings: [], + }; + } + + private async handleWarningResponse(shouldContinue: boolean) { + this.setState({ warningMessage: false }); + if (!shouldContinue) { + this.setState({ showDriveSelectorModal: true }); + return; + } + this.setState({ + errorMessage: await flashImageToDrive( + this.props.isFlashing, + this.props.goToSuccess, + ), + }); + } + + private handleFlashErrorResponse(shouldRetry: boolean) { + this.setState({ errorMessage: '' }); + flashState.resetState(); + if (!shouldRetry) { + selection.clear(); + } + } + + private hasListWarnings(drives: any[]) { + if (drives.length === 0 || flashState.isFlashing()) { + return; + } + return drives.filter((drive) => drive.isSystem).length > 0; + } + + private async tryFlash() { + const drives = selection.getSelectedDrives().map((drive) => { + return { + ...drive, + statuses: constraints.getDriveImageCompatibilityStatuses( + drive, + undefined, + true, + ), + }; + }); + if (drives.length === 0 || this.props.isFlashing) { + return; + } + const hasDangerStatus = drives.some((drive) => drive.statuses.length > 0); + if (hasDangerStatus) { + const systemDrives = drives.some((drive) => + drive.statuses.includes(constraints.statuses.system), + ); + this.setState({ + systemDrives, + drivesWithWarnings: drives.filter((driveWithWarnings) => { + return ( + driveWithWarnings.isSystem || + (!systemDrives && + driveWithWarnings.statuses.includes(constraints.statuses.large)) + ); + }), + warningMessage: true, + }); + return; + } + this.setState({ + errorMessage: await flashImageToDrive( + this.props.isFlashing, + this.props.goToSuccess, + ), + }); + } + + public render() { + return ( + <> + + + + this.tryFlash()} + /> + + {!_.isNil(this.props.speed) && + this.props.percentage !== COMPLETED_PERCENTAGE && ( + + + {i18next.t('flash.speedShort', { + speed: this.props.speed.toFixed(SPEED_PRECISION), + })} + + {!_.isNil(this.props.eta) && ( + + {i18next.t('flash.eta', { + eta: formatSeconds(this.props.eta), + })} + + )} + + )} + + {Boolean(this.props.failed) && ( + + + {this.props.failed} + {messages.progress.failed(this.props.failed)} + + )} + + + {this.state.warningMessage && ( + this.handleWarningResponse(true)} + cancel={() => this.handleWarningResponse(false)} + isSystem={this.state.systemDrives} + drivesWithWarnings={this.state.drivesWithWarnings} + /> + )} + + {this.state.errorMessage && ( + this.handleFlashErrorResponse(false)} + done={() => this.handleFlashErrorResponse(true)} + action={'Retry'} + > + + {this.state.errorMessage.split('\n').map((message, key) => ( +

{message}

+ ))} +
+
+ )} + {this.state.showDriveSelectorModal && ( + this.setState({ showDriveSelectorModal: false })} + done={(modalTargets) => { + selectAllTargets(modalTargets); + this.setState({ showDriveSelectorModal: false }); + }} + /> + )} + + ); + } +} diff --git a/lib/gui/app/pages/main/MainPage.tsx b/lib/gui/app/pages/main/MainPage.tsx new file mode 100644 index 0000000..f8c9aa2 --- /dev/null +++ b/lib/gui/app/pages/main/MainPage.tsx @@ -0,0 +1,408 @@ +/* + * Copyright 2019 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import CogSvg from '@fortawesome/fontawesome-free/svgs/solid/gear.svg'; +import CloseSvg from '@fortawesome/fontawesome-free/svgs/solid/x.svg'; +import QuestionCircleSvg from '@fortawesome/fontawesome-free/svgs/solid/circle-question.svg'; + +import * as path from 'path'; +import prettyBytes from 'pretty-bytes'; +import * as React from 'react'; +import { Alert, Flex, Link } from 'rendition'; +import styled from 'styled-components'; + +import FinishPage from '../../components/finish/finish'; +import { ReducedFlashingInfos } from '../../components/reduced-flashing-infos/reduced-flashing-infos'; +import { SettingsModal } from '../../components/settings/settings'; +import { SourceSelector } from '../../components/source-selector/source-selector'; +import type { SourceMetadata } from '../../../../shared/typings/source-selector'; +import * as flashState from '../../models/flash-state'; +import * as selectionState from '../../models/selection-state'; +import * as settings from '../../models/settings'; +import { observe } from '../../models/store'; +import { open as openExternal } from '../../os/open-external/services/open-external'; +import { + IconButton as BaseIcon, + IconButton, + ThemedProvider, +} from '../../styled-components'; + +import { + TargetSelector, + getDriveListLabel, +} from '../../components/target-selector/target-selector'; +import { FlashStep } from './Flash'; + +import EtcherSvg from '../../../assets/etcher.svg'; +import { SafeWebview } from '../../components/safe-webview/safe-webview'; +import { theme } from '../../theme'; + +const Icon = styled(BaseIcon)` + margin-right: 20px; +`; + +function getDrivesTitle() { + const drives = selectionState.getSelectedDrives(); + + if (drives.length === 1) { + return drives[0].description || 'Untitled Device'; + } + + if (drives.length === 0) { + return 'No targets found'; + } + + return `${drives.length} Targets`; +} + +function getImageBasename(image?: SourceMetadata) { + if (image === undefined) { + return ''; + } + + if (image.drive) { + return image.drive.description; + } + const imageBasename = path.basename(image.path); + return image.name || imageBasename; +} + +const StepBorder = styled.div<{ + disabled: boolean; + left?: boolean; + right?: boolean; +}>` + position: relative; + height: 2px; + background-color: ${(props) => + props.disabled + ? props.theme.colors.dark.disabled.foreground + : props.theme.colors.dark.foreground}; + width: 120px; + top: 19px; + + left: ${(props) => (props.left ? '-67px' : undefined)}; + margin-right: ${(props) => (props.left ? '-120px' : undefined)}; + right: ${(props) => (props.right ? '-67px' : undefined)}; + margin-left: ${(props) => (props.right ? '-120px' : undefined)}; +`; + +const ANALYTICS_ALERT_VISIBILITY_KEY = 'analytics_alert_visible'; + +interface MainPageStateFromStore { + isFlashing: boolean; + hasImage: boolean; + hasDrive: boolean; + imageLogo?: string; + imageSize?: number; + imageName?: string; + driveTitle: string; + driveLabel: string; +} + +interface MainPageState { + current: 'main' | 'success'; + isWebviewShowing: boolean; + hideSettings: boolean; + featuredProjectURL?: string; + analyticsAlertIsVisible: boolean; +} + +export class MainPage extends React.Component< + object, + MainPageState & MainPageStateFromStore +> { + constructor(props: object) { + super(props); + this.state = { + current: 'main', + isWebviewShowing: false, + hideSettings: true, + analyticsAlertIsVisible: + localStorage.getItem(ANALYTICS_ALERT_VISIBILITY_KEY) !== 'false', + ...this.stateHelper(), + }; + } + + private stateHelper(): MainPageStateFromStore { + const image = selectionState.getImage(); + return { + isFlashing: flashState.isFlashing(), + hasImage: selectionState.hasImage(), + hasDrive: selectionState.hasDrive(), + imageLogo: image?.logo, + imageSize: image?.size, + imageName: getImageBasename(selectionState.getImage()), + driveTitle: getDrivesTitle(), + driveLabel: getDriveListLabel(), + }; + } + + private async getFeaturedProjectURL() { + const url = new URL( + (await settings.get('featuredProjectEndpoint')) || + 'https://efp.balena.io/index.html', + ); + url.searchParams.append('borderRight', 'false'); + url.searchParams.append('darkBackground', 'true'); + return url.toString(); + } + + private hideAnalyticsAlert = () => { + if (this.state.analyticsAlertIsVisible) { + localStorage.setItem(ANALYTICS_ALERT_VISIBILITY_KEY, 'false'); + this.setState({ analyticsAlertIsVisible: false }); + } + }; + + public async componentDidMount() { + observe(() => { + this.setState(this.stateHelper()); + }); + this.setState({ featuredProjectURL: await this.getFeaturedProjectURL() }); + } + + public componentDidUpdate( + _prevProps: object, + prevState: Readonly, + ) { + if (this.state.analyticsAlertIsVisible) { + if (prevState.hideSettings !== this.state.hideSettings) { + this.setState({ analyticsAlertIsVisible: false }); + } + } + } + + private renderMain() { + const state = flashState.getFlashState(); + const shouldDriveStepBeDisabled = !this.state.hasImage; + const shouldFlashStepBeDisabled = + !this.state.hasImage || !this.state.hasDrive; + const notFlashingOrSplitView = + !this.state.isFlashing || !this.state.isWebviewShowing; + return ( + + + {notFlashingOrSplitView && ( + <> + + + + + + + + + + )} + + {this.state.isFlashing && this.state.isWebviewShowing && ( + + + + )} + {this.state.isFlashing && this.state.featuredProjectURL && ( + { + this.setState({ isWebviewShowing }); + }} + style={{ + position: 'absolute', + right: 0, + bottom: 0, + width: '63.8vw', + height: '100vh', + }} + /> + )} + + this.setState({ current: 'success' })} + shouldFlashStepBeDisabled={shouldFlashStepBeDisabled} + isFlashing={this.state.isFlashing} + step={state.type} + percentage={state.percentage} + position={state.position} + failed={state.failed} + speed={state.speed} + eta={state.eta} + style={{ zIndex: 1 }} + /> + + {this.state.analyticsAlertIsVisible && ( + + + +
+ Etcher collects a limited amount of anonymous data to help us + improve user experience. You can opt out in the{' '} + this.setState({ hideSettings: false })}> + settings + + . +
+
+ For more information about how we use this data, see our{' '} + { + e.stopPropagation(); + openExternal('https://www.balena.io/privacy-policy'); + }} + > + privacy policy + + . +
+
+ {/* TODO: can we use onDismiss instead? */} + + + +
+
+ )} +
+ ); + } + + private renderSuccess() { + return ( + { + flashState.resetState(); + this.setState({ current: 'main' }); + }} + /> + ); + } + + public render() { + return ( + + + + + + openExternal('https://www.balena.io/etcher?ref=etcher_footer') + } + tabIndex={100} + /> + + + + } + plain + tabIndex={5} + onClick={() => this.setState({ hideSettings: false })} + style={{ + // Make touch events click instead of dragging + WebkitAppRegion: 'no-drag', + }} + /> + {!settings.getSync('disableExternalLinks') && ( + } + onClick={() => + openExternal( + selectionState.getImage()?.supportUrl || + 'https://github.com/balena-io/etcher/blob/master/docs/SUPPORT.md', + ) + } + tabIndex={6} + style={{ + // Make touch events click instead of dragging + WebkitAppRegion: 'no-drag', + }} + /> + )} + + + {this.state.hideSettings ? null : ( + { + this.setState({ hideSettings: !value }); + }} + /> + )} + {this.state.current === 'main' + ? this.renderMain() + : this.renderSuccess()} + + ); + } +} + +export default MainPage; diff --git a/lib/gui/app/preload.ts b/lib/gui/app/preload.ts new file mode 100644 index 0000000..ad1b81a --- /dev/null +++ b/lib/gui/app/preload.ts @@ -0,0 +1,12 @@ +// See the Electron documentation for details on how to use preload scripts: +// https://www.electronjs.org/docs/latest/tutorial/process-model#preload-scripts + +import * as webapi from '../webapi'; + +declare global { + interface Window { + etcher: typeof webapi; + } +} + +window['etcher'] = webapi; diff --git a/lib/gui/app/renderer.ts b/lib/gui/app/renderer.ts new file mode 100644 index 0000000..7986365 --- /dev/null +++ b/lib/gui/app/renderer.ts @@ -0,0 +1,9 @@ +// @ts-nocheck +import { main } from './app'; +import './i18n'; +import { langParser } from './i18n'; +import { ipcRenderer } from 'electron'; + +ipcRenderer.send('change-lng', langParser()); + +main(); diff --git a/lib/gui/app/styled-components.tsx b/lib/gui/app/styled-components.tsx new file mode 100644 index 0000000..0cc2228 --- /dev/null +++ b/lib/gui/app/styled-components.tsx @@ -0,0 +1,335 @@ +/* + * Copyright 2018 balena.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from 'react'; +import type { + FlexProps, + ButtonProps, + TableProps as BaseTableProps, +} from 'rendition'; +import { + Alert as AlertBase, + Flex, + Button, + Modal as ModalBase, + Provider, + Table as BaseTable, + Txt, +} from 'rendition'; +import styled, { css } from 'styled-components'; + +import { colors, theme } from './theme'; + +export const ThemedProvider = (props: any) => ( + +); + +export const BaseButton = styled(Button)` + width: 200px; + height: 48px; + font-size: 16px; +`; + +export const IconButton = styled((props) =>

!QPC_xZ#fUTw3CE^1N)!TqANLPiJ6J{nK18hYJHr~4O zV}wksUMul>MOs=6n&Iq4@~LF&Q9&l06eq{e<%F`-#-M?D12dQj4iA>a zju<8na3dBI<5`*clTYvCRmyA~HYQ7h>1JV^KAl>Bt%G*c`$H_oGzvR-2mySfao&e1 z1Cy+QcI%QH2_?{|Yb7UO5~QW(`+e*QaTPxU?XK}SLMS&!T~h@D47CdzLDoIW3Y5Mg zpxrY+F4h&`N3O+jG2~Q>EXI`D&vIxtBH$!-STy`J{KH-aW)(gAiT@kg`4Ik)c0R+w zjQ0I>=p9KB=+LXpMd-|j%s}bHlfZ#aJjvoJo%d^T_?MPl>oNb_-qt?Jlc&41MQ&_7 z$U`i~0i%E`UmmiMt82=ZD&x!e$vpUK3hVOMIj-A5wNSpl zu&66R5%1d&%7p}yzZ@#~Uu0G&LLERXa8hv*!~zwBSYW#RCia9%g0BL5aZLn*R?f2fI_< zAZBqNw$D|2R8H^-J>F@r=7kkE-Zf`1JDuU&6BAQ$c9)0!xxC#?MjdItzOp`amXt4; zN(UNt+yUW;%T^F(80N_jf%@MGv^5R30jTf07sBASV#QZ$l3rYJ5C)$oz|?2Fwwcm% zWFBC@3a~%n8m0$IhDbP!yAgl{A53mJC+Hh|zID)bcg}{}xhr=(GJw}Pl%h#etw!a* zz+%|ZLI{uQ)?Ldo3CL7tz*F0{)-`UQ(fJR-+nUNQ_)7L4-@#w`!>o)CopM*dwj0i2 z>lzziRj)ifQJNSbNK$3qKR2}HktW(*Y9Vlfr#L02wx|)nJfjt{7+w~)vas=pMS^Sn z{)5DpZ1AqY5}>g9MDdEZ!2QSqC2rNQ_sx9gr`vmK_vMtiFqrQ_XyZ3@>`4X)PlPa* z&ib9#7k#i6RKMR4b2V^`n&@7j*-uO0>8QdmXNO5;rIDJd^TNXD3>mbZp_X;cK^aC` zb)yQ*H?d$n)T^-)0W#TT}1THNpju2NDMJOI8u$7sJ4rwQc6ta_P?hXv7%(qLkjYqrLX6h{1JZ9} zE2mNv1{~lC#U*Siqwx$FkfhAa2ULoJ#b)CMcnEV;*NOZi5g3raA1@PQVUBw!!z$6z zZ_nBawo&`3WkDI7iLeLem=;u#07K8~Mn1Kl2(*hz)5)d5M`N8cfq5AijIkbL1@a^@ zv`fQJ!%xyI^z0{apq&rlUh)62^T~c_d<{XEF@9bPLq<7M*)zt_6>Ik*6!r<2{GypR zeY;47*tOT9y)~KJKe}5IK1_}1b3Tb|%?#tLo?TVcz{5bt`HH#JxG-og5~uVOP~A3% z?S?bFs6kCxE!KOUY}-wZjkppu#XboM3YHbt{2_)KFqzOjB#0W%G&9x6yJtS`lyHM_ zL}I4&lVF^Pj=MP^cub9z60x2=Zbl7dDdXL6#Xuu9(6gCV7@ALw!|F&S4fUv8Kte-3 h3JpkZ{-d)x>i*2v8yg3Ieu==JpZ8L)3eTuLe*yc*!NdRn literal 0 HcmV?d00001 diff --git a/assets/icon.icns b/assets/icon.icns new file mode 100755 index 0000000000000000000000000000000000000000..2720d1212d0d5aefe29d12adbc4011d49e026f1a GIT binary patch literal 272793 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�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%0D>mV*J&O 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%0A+cTn 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 z