Repository: balena-io/etcher Branch: master Commit: a79db1db6b94 Files: 126 Total size: 2.1 MB Directory structure: gitextract_w2glr8_c/ ├── .dockerignore ├── .editorconfig ├── .eslintrc.js ├── .gitattributes ├── .github/ │ ├── ISSUE_TEMPLATE.md │ ├── actions/ │ │ ├── publish/ │ │ │ └── action.yml │ │ └── test/ │ │ └── action.yml │ └── workflows/ │ ├── flowzone.yml │ └── winget.yml ├── .gitignore ├── .nvmrc ├── .prettierrc.js ├── .versionbot/ │ └── CHANGELOG.yml ├── CHANGELOG.md ├── LICENSE ├── README.md ├── after-install.tpl ├── assets/ │ ├── dmg/ │ │ └── background.tiff │ └── icon.icns ├── docs/ │ ├── ARCHITECTURE.md │ ├── COMMIT-GUIDELINES.md │ ├── CONTRIBUTING.md │ ├── FAQ.md │ ├── MAINTAINERS.md │ ├── MANUAL-TESTING.md │ ├── PUBLISHING.md │ ├── SUPPORT.md │ └── USER-DOCUMENTATION.md ├── entitlements.mac.plist ├── forge.config.ts ├── forge.sidecar.ts ├── lib/ │ ├── gui/ │ │ ├── app/ │ │ │ ├── app.ts │ │ │ ├── components/ │ │ │ │ ├── drive-selector/ │ │ │ │ │ └── drive-selector.tsx │ │ │ │ ├── drive-status-warning-modal/ │ │ │ │ │ └── drive-status-warning-modal.tsx │ │ │ │ ├── finish/ │ │ │ │ │ └── finish.tsx │ │ │ │ ├── flash-another/ │ │ │ │ │ └── flash-another.tsx │ │ │ │ ├── flash-results/ │ │ │ │ │ └── flash-results.tsx │ │ │ │ ├── progress-button/ │ │ │ │ │ └── progress-button.tsx │ │ │ │ ├── reduced-flashing-infos/ │ │ │ │ │ └── reduced-flashing-infos.tsx │ │ │ │ ├── safe-webview/ │ │ │ │ │ └── safe-webview.tsx │ │ │ │ ├── settings/ │ │ │ │ │ └── settings.tsx │ │ │ │ ├── source-selector/ │ │ │ │ │ └── source-selector.tsx │ │ │ │ ├── svg-icon/ │ │ │ │ │ └── svg-icon.tsx │ │ │ │ └── target-selector/ │ │ │ │ ├── target-selector-button.tsx │ │ │ │ └── target-selector.tsx │ │ │ ├── css/ │ │ │ │ └── main.css │ │ │ ├── i18n/ │ │ │ │ ├── README.md │ │ │ │ ├── en.ts │ │ │ │ ├── zh-CN.ts │ │ │ │ └── zh-TW.ts │ │ │ ├── i18n.ts │ │ │ ├── index.html │ │ │ ├── models/ │ │ │ │ ├── available-drives.ts │ │ │ │ ├── flash-state.ts │ │ │ │ ├── leds.ts │ │ │ │ ├── selection-state.ts │ │ │ │ ├── settings.ts │ │ │ │ └── store.ts │ │ │ ├── modules/ │ │ │ │ ├── analytics.ts │ │ │ │ ├── api.ts │ │ │ │ ├── exception-reporter.ts │ │ │ │ ├── image-writer.ts │ │ │ │ └── progress-status.ts │ │ │ ├── os/ │ │ │ │ ├── dialog.ts │ │ │ │ ├── notification.ts │ │ │ │ ├── open-external/ │ │ │ │ │ └── services/ │ │ │ │ │ └── open-external.ts │ │ │ │ ├── window-progress.ts │ │ │ │ └── windows-network-drives.ts │ │ │ ├── pages/ │ │ │ │ └── main/ │ │ │ │ ├── Flash.tsx │ │ │ │ └── MainPage.tsx │ │ │ ├── preload.ts │ │ │ ├── renderer.ts │ │ │ ├── styled-components.tsx │ │ │ ├── theme.ts │ │ │ └── utils/ │ │ │ ├── etcher-pro-specific.ts │ │ │ └── middle-ellipsis.ts │ │ ├── etcher.ts │ │ ├── menu.ts │ │ └── webapi.ts │ ├── shared/ │ │ ├── drive-constraints.ts │ │ ├── errors.ts │ │ ├── exit-codes.ts │ │ ├── messages.ts │ │ ├── permissions.ts │ │ ├── sudo/ │ │ │ ├── darwin.ts │ │ │ ├── linux.ts │ │ │ ├── sudo-askpass.osascript-en.js │ │ │ ├── sudo-askpass.osascript-zh.js │ │ │ └── windows.ts │ │ ├── supported-formats.ts │ │ ├── units.ts │ │ └── utils.ts │ └── util/ │ ├── api.ts │ ├── child-writer.ts │ ├── drive-scanner.ts │ ├── scanner.ts │ ├── source-metadata.ts │ └── types/ │ └── types.d.ts ├── npm-shrinkwrap.json ├── package.json ├── pkg-sidecar.json ├── repo.yml ├── tests/ │ ├── .eslintrc.yml │ ├── data/ │ │ └── wmic-output.txt │ ├── gui/ │ │ ├── allow-renderer-process-reuse.ts │ │ ├── models/ │ │ │ ├── available-drives.spec.ts │ │ │ ├── flash-state.spec.ts │ │ │ ├── selection-state.spec.ts │ │ │ └── settings.spec.ts │ │ ├── modules/ │ │ │ ├── image-writer.spec.ts │ │ │ └── progress-status.spec.ts │ │ ├── os/ │ │ │ ├── window-progress.spec.ts │ │ │ └── windows-network-drives.spec.ts │ │ ├── utils/ │ │ │ └── middle-ellipsis.spec.ts │ │ └── window-config.json │ ├── shared/ │ │ ├── drive-constraints.spec.ts │ │ ├── errors.spec.ts │ │ ├── messages.spec.ts │ │ ├── supported-formats.spec.ts │ │ ├── units.spec.ts │ │ └── utils.spec.ts │ └── test.e2e.ts ├── tsconfig.json ├── tsconfig.sidecar.json ├── wdio.conf.ts └── webpack.config.ts ================================================ FILE CONTENTS ================================================ ================================================ FILE: .dockerignore ================================================ * !requirements.txt ================================================ FILE: .editorconfig ================================================ # 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 ================================================ FILE: .eslintrc.js ================================================ 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", }, }; ================================================ FILE: .gitattributes ================================================ # 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 ================================================ FILE: .github/ISSUE_TEMPLATE.md ================================================ - **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?** ================================================ FILE: .github/actions/publish/action.yml ================================================ --- 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 ================================================ FILE: .github/actions/test/action.yml ================================================ --- 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 ================================================ FILE: .github/workflows/flowzone.yml ================================================ 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-13"], ["macos-latest-xlarge"] ] } custom_publish_matrix: > { "os": [ ["ubuntu-22.04"], ["windows-2022"], ["macos-13"], ["macos-latest-xlarge"] ] } restrict_custom_actions: false github_prerelease: true cloudflare_website: 'etcher' ================================================ FILE: .github/workflows/winget.yml ================================================ 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 }} ================================================ FILE: .gitignore ================================================ # -- 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 ================================================ FILE: .nvmrc ================================================ 18 ================================================ FILE: .prettierrc.js ================================================ const fs = require("fs"); const path = require("path"); module.exports = JSON.parse( fs.readFileSync(path.join(__dirname, "node_modules", "@balena", "lint", "config", ".prettierrc"), "utf8"), ); ================================================ FILE: .versionbot/CHANGELOG.yml ================================================ - 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 ================================================ FILE: CHANGELOG.md ================================================ # 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.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. ================================================ FILE: LICENSE ================================================ 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 ================================================ FILE: README.md ================================================ # 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 ================================================ FILE: after-install.tpl ================================================ #!/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 ================================================ FILE: docs/ARCHITECTURE.md ================================================ 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 ================================================ FILE: docs/COMMIT-GUIDELINES.md ================================================ 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 ================================================ FILE: docs/CONTRIBUTING.md ================================================ 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 ================================================ FILE: docs/FAQ.md ================================================ ## 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: `` ================================================ FILE: docs/MAINTAINERS.md ================================================ # 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 ================================================ FILE: docs/MANUAL-TESTING.md ================================================ # 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 ================================================ FILE: docs/PUBLISHING.md ================================================ 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) ================================================ FILE: docs/SUPPORT.md ================================================ 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 ================================================ FILE: docs/USER-DOCUMENTATION.md ================================================ 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. ================================================ FILE: entitlements.mac.plist ================================================ 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 ================================================ FILE: forge.config.ts ================================================ 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; ================================================ FILE: forge.sidecar.ts ================================================ 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); }, }; } } ================================================ FILE: lib/gui/app/app.ts ================================================ /* * 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 } }, ); } ================================================ FILE: lib/gui/app/components/drive-selector/drive-selector.tsx ================================================ /* * 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, }) } /> )} ); } } ================================================ FILE: lib/gui/app/components/drive-status-warning-modal/drive-status-warning-modal.tsx ================================================ 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; ================================================ FILE: lib/gui/app/components/finish/finish.tsx ================================================ /* * 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; ================================================ FILE: lib/gui/app/components/flash-another/flash-another.tsx ================================================ /* * 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')} ); }; ================================================ FILE: lib/gui/app/components/flash-results/flash-results.tsx ================================================ /* * 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(); }} >
)} ); } ================================================ FILE: lib/gui/app/components/progress-button/progress-button.tsx ================================================ /* * 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')} ); } } ================================================ FILE: lib/gui/app/components/reduced-flashing-infos/reduced-flashing-infos.tsx ================================================ /* * 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)} ); } } ================================================ FILE: lib/gui/app/components/safe-webview/safe-webview.tsx ================================================ /* * 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); } } } } ================================================ FILE: lib/gui/app/components/settings/settings.tsx ================================================ /* * 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} ); } ================================================ FILE: lib/gui/app/components/source-selector/source-selector.tsx ================================================ /* * 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'); } }} /> )} ); } } ================================================ FILE: lib/gui/app/components/svg-icon/svg-icon.tsx ================================================ /* * 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 ; } } ================================================ FILE: lib/gui/app/components/target-selector/target-selector-button.tsx ================================================ /* * 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')} ); } ================================================ FILE: lib/gui/app/components/target-selector/target-selector.tsx ================================================ /* * 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); }} /> )} ); }; ================================================ FILE: lib/gui/app/css/main.css ================================================ /* * 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. */ @font-face { font-family: 'SourceSansPro'; src: url('./fonts/SourceSansPro-Regular.ttf') format('truetype'); font-weight: 500; font-style: normal; } @font-face { font-family: 'SourceSansPro'; src: url('./fonts/SourceSansPro-SemiBold.ttf') format('truetype'); font-weight: 600; font-style: normal; } html, body { margin: 0; overflow: hidden; /* Prevent white flash when running application */ background-color: #4d5057; /* Prevent WebView bounce effect in OS X */ height: 100%; width: 100%; } /* Prevent text selection */ body { -webkit-user-select: none; -webkit-overflow-scrolling: touch; } /* Prevent blue outline */ a:focus, input:focus, button:focus, [tabindex]:focus, input[type='checkbox'] + div { outline: none !important; box-shadow: none !important; } .disabled { opacity: 0.4; } #rendition-tooltip-root > div { font-family: 'SourceSansPro', sans-serif; } ================================================ FILE: lib/gui/app/i18n/README.md ================================================ # 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. ================================================ FILE: lib/gui/app/i18n/en.ts ================================================ 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; ================================================ FILE: lib/gui/app/i18n/zh-CN.ts ================================================ 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; ================================================ FILE: lib/gui/app/i18n/zh-TW.ts ================================================ 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; ================================================ FILE: lib/gui/app/i18n.ts ================================================ 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; ================================================ FILE: lib/gui/app/index.html ================================================ balenaEtcher
================================================ FILE: lib/gui/app/models/available-drives.ts ================================================ /* * 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; } ================================================ FILE: lib/gui/app/models/flash-state.ts ================================================ /* * 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; } ================================================ FILE: lib/gui/app/models/leds.ts ================================================ /* * 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 })); } } ================================================ FILE: lib/gui/app/models/selection-state.ts ================================================ 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); } ================================================ FILE: lib/gui/app/models/settings.ts ================================================ /* * 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); } ================================================ FILE: lib/gui/app/models/store.ts ================================================ /* * 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); } ================================================ FILE: lib/gui/app/modules/analytics.ts ================================================ /* * 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); } } ================================================ FILE: lib/gui/app/modules/api.ts ================================================ /** 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 }; ================================================ FILE: lib/gui/app/modules/exception-reporter.ts ================================================ /* * 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); } ================================================ FILE: lib/gui/app/modules/image-writer.ts ================================================ /* * 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); } } ================================================ FILE: lib/gui/app/modules/progress-status.ts ================================================ /* * 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; } ================================================ FILE: lib/gui/app/os/dialog.ts ================================================ /* * 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); } ================================================ FILE: lib/gui/app/os/notification.ts ================================================ /* * 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 }); } ================================================ FILE: lib/gui/app/os/open-external/services/open-external.ts ================================================ /* * 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); } } ================================================ FILE: lib/gui/app/os/window-progress.ts ================================================ /* * 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)); } ================================================ FILE: lib/gui/app/os/windows-network-drives.ts ================================================ /* * 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; } ================================================ FILE: lib/gui/app/pages/main/Flash.tsx ================================================ /* * 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 }); }} /> )} ); } } ================================================ FILE: lib/gui/app/pages/main/MainPage.tsx ================================================ /* * 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; ================================================ FILE: lib/gui/app/preload.ts ================================================ // 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; ================================================ FILE: lib/gui/app/renderer.ts ================================================ // @ts-nocheck import { main } from './app'; import './i18n'; import { langParser } from './i18n'; import { ipcRenderer } from 'electron'; ipcRenderer.send('change-lng', langParser()); main(); ================================================ FILE: lib/gui/app/styled-components.tsx ================================================ /* * 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) =>